Redis雪崩、击穿、穿透
雪崩:
场景:
缓存都是定时任务去刷新或者查询不到时去数据库查询
示例:
如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。
解决方案:
- 设置随机过期时间
setRedis(Key,value,time + Math.random() * 10000);
- 秒杀时提前加载数据,加载时需要注意加载量(视情况而定)
穿透:
场景:
当并发量瞬间爆发时,就会出现缓存不存在,直接打到DB上
解决方案:
当缓存中没有对应数据时通过加锁方式后,再去数据库查询
代码示例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJC125sO-1602900905956)(https://i.loli.net/2020/10/16/2rndeWcYy6mGEUj.png)]
Redis击穿:
场景:
当缓存中没有、数据中也没有的时候,大量用户访问时,就会直接将查询打到DB中。
解决方案:
使用布隆过滤器(Bloom Filter)来标识数据库中没有的数据