C#缓存-----理解随记

缓存:为了快速获取结果,在第一次获取数据后存起来,下次直接用
缓存依托内存,系统重启后,缓存会重启
缓存究竟用在哪里?
1会重复请求,2数据相对稳定 3 耗时,耗资源4 体积不大


配置文件,菜单--权限,省市区,类别数据,热搜(二八原则),分页(只要数据不是经常变),
公告,技能属性,数据字典
如果一个数据缓存一次,能被有效的查询4次,就是值得的
(大型系统的时候,为了性能,为了压力,更多缓存)

缓存一般是会有延迟的,这个很难避免,因为缓存的本质决定了是使用上一次的结果
缓存本身是共享的,应该是唯一的
本地缓存空间小,不能跨进程共享
小项目可以随意缓存
中大型不够用的,一般会用分布式缓存

一旦数据修改怎么处理?
1、一个用户权限----用户-角色-菜单 查询比较麻烦,也很频繁,相对稳定,所以为每个用户缓存一个
假如修改了某个用户的角色, 缓存数据的其实失效了
这时只有某一个数据的权限数据失效,则Remove掉
Remove不是update的原因:缓存只是一个临时存储,不是数据源

2、删除一个菜单,会影响一大批用户,
若:菜单-角色-用户,然后拼装出全部的key,然后遍历删除?- - 成本太高,缓存应该是提升性能
若:全部删除 ,RemoveALL ,会误删别的缓存,造成缓存穿透
想:清楚跟菜单有关的数据
在key里做文章,把缓存数据分类
只要缓存跟菜单有关的额数据都加上_Menu_
想:只删除那一个MenuID ,--不可能,控制不了那么细致

3、定时作业更新了数据---远程接口更新了数据,更多的时候是我们不知道数据变了
给系统提供了一个接口,更新数据也来通知下系统(能解决少量场景)
缓存是沿用上一次的结果,根本不会去数据源的----肯定有误差
可以做一下过期,加个时间有效性,数据延迟来换取性能,需要抉择
只要在有效期内,不管数据源有没有变化,都以缓存为准
只要超过有效期,不管数据源有没有变化,都去重新获取
主动清理:只要是过期,最多超过10分钟,一定会被清理
被动清理:除非我们去访问这条缓存,才会去清理,任何过期的数据,都不可以被查到


4、自定义缓存
多线程并发了,插入数据,删除,查询会不会冲突?? 肯定会的
加锁,基本全部环节都是需要lock的,操作并不是很耗时间但是锁很耗时间

线程安全的字段ConcurrentDictionary 多线程操作时候不冲突,内部实现了锁的
如果要线程安全,对一块内存的操作,必须是单线程的

原文地址:https://www.cnblogs.com/Yida-Tingting/p/12924343.html