c# redis之缓存击穿雪崩
https://www.bilibili.com/video/BV12b4y1y7CR?spm_id_from=333.999.0.0
1 缓存击穿
缓存击穿指的是可能是由于缓存时间到期,这时并发用户特别多,同时在缓存中没读到数据,然后又都到数据库去读数据,导致数据库压力过大
解决方法:可以加锁,设置热点数据(限制redis占用的内存大小,超过这个限制之后redis根据自身的淘汰策略优先删除最少使用的数据),注意,淘汰策略都是在配置文件中配置的。
2 缓存雪崩
指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
解决方案:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
然后还是设置热点数据。
3 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
解决方法: 如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,就是说将传来的key值存储到redis中,只不过对应的值是空值,但它的过期时间会很短,最长不超过五分钟(因为是没什么意义的数据,没必要存太长时间)。这样可以有效避免短时间内重复的调用,导致数据库崩溃