一、缓存雪崩:所有请求都到了数据库了,造成DB故障,从而引起所有应用服务器故障
1. 缓存挂了或者缓存服务器重启
2. 手动把所有缓存都删除了(flushall)
3. 缓存没有挂,但预加载的key同时到期,或者集中在某一段时间过期
二、缓存雪崩的解决方法
1. 缓存挂了的情况
a. 事发前:实现redis的高可用性(主从+sentinal+cluster)
b. 事发时:本地内存缓存(二级缓存)+限流(hystrix)
c. 事发后:Redis持久化,重启后从磁盘上加载数据,快速恢复
2. 缓存没挂的情况
预加载时,key的过期时间为随机值,防止同时过期
三、缓存穿透
1. 查询一个不存在的数据,由于没有从数据库里查到,就不放入缓存,所以不存在的数据每次都要到数据库里查询
2. 请求的数据在缓存里大量不命中,导致请求到了数据库,就叫缓存穿透
四、缓存穿透的解决方法
1. 校验参数,对一定不存在的key进行过滤
2. 把空对象也放入缓存,并设置一个较短的过期时间
3. 布隆过滤器
五、缓存击穿
大量请求查询某个key,一直到这个key过期,此时大量请求会落到数据库
六、缓存击穿的解决方法
1. 为单独的key加锁
2. 热点数据永不过期