Redis雪崩、击穿、穿透

Redis雪崩、击穿、穿透

雪崩:

场景:

缓存都是定时任务去刷新或者查询不到时去数据库查询

示例:

如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。

解决方案:

  1. 设置随机过期时间
    setRedis(Key,value,time + Math.random() * 10000);
  2. 秒杀时提前加载数据,加载时需要注意加载量(视情况而定)

Redis雪崩、击穿、穿透

穿透:

场景:

当并发量瞬间爆发时,就会出现缓存不存在,直接打到DB上

解决方案:

当缓存中没有对应数据时通过加锁方式后,再去数据库查询

代码示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJC125sO-1602900905956)(https://i.loli.net/2020/10/16/2rndeWcYy6mGEUj.png)]

Redis击穿:

场景:

当缓存中没有、数据中也没有的时候,大量用户访问时,就会直接将查询打到DB中。

解决方案:

使用布隆过滤器(Bloom Filter)来标识数据库中没有的数据

Redis雪崩、击穿、穿透