缓存穿透是指查询一个一定不存在的数据(比如连mysql都没得数据,Redis怎么也查不到啊),由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
在流量大时,可能数据库就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
有很多种方法可以有效地解决缓存穿透问题
简介:缓存同一时间大面积的失效(比如我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,或者redis突然宕机了,请求全部转发到DB,DB瞬时压力过重雪崩。
预防措施(雪崩前):
失效中措施
1、在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待
2、做二级缓存,一级缓存未查询到数据,则从二级缓存查询
雪崩后后处理
如果雪崩原因是redis宕机的情况,我们需要利用 redis 持久化机制保存的数据尽快恢复缓存