产生原因
查询了一个不存在的数据,由于缓存中没有,所以就去数据库中查询,但是数据库也没有,我们也没有事先将null的key写入缓存,所以对于不存在的数据每次都去访问db,一旦流量过大,会导致db直接崩溃,甚至会成为别人进行恶意攻击的漏洞
解决方法
- 将key为null的对象写入缓存,但是它的过期时间很短,最长不超过5分钟.利用布隆过滤器(Bloom):将所有可能存在的数据哈希到一个足够大的bitmap中,这样一个一定不存在的数据会被bitmap拦截,从而减少了db的压力
产生原因
有一些设置了一些过期时间的key在某些时间点被超高并发地访问,如果这些热点数据正好过期,那么对这些key的查询都落到了db上.造成压力过大
解决方法
使用互斥锁(mutex key):在缓存失效的时候,不是立即去load db,而是先去使用缓存工具的某些带成功操作返回值的操作(比如Redis的setnx或者memcache的add)去设置一个mute key,当操作返回成功时,再进行load db的操作并回设操作;否则就重试整个get缓存的方法
SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。
产生原因
我们设置缓存时间采用了相同的过期时间,导致大量数据某一时刻同时失效,请求全部到db,以至于db瞬间压力过大
解决方法
在原有的失效时间基础上增加一个随机值,这样每一个缓存过期时间的重复率就会降低,就很难引发集体失效的事件.



