文章目录
参考视频
什么是Redis缓存雪崩、穿透、击穿,十分钟给你讲的明明白白
1.缓存穿透 - 不常规的key请求
1.1.什么是缓存穿透
恶意用户使用不常规的key发起大量请求,这些请求在缓存中无法命中,最终直接穿透缓存落入MySQL(如id= -1 )。
由于这个key不常规,缓存无法命中,最终都会穿透缓存进入到MySQL中,并进行全表查询。
当大量此类请求涌入MySQL服务器,便会使得MySQL节点宕机。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uIiEKEyK-1649700661204)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220306180612183.png)]
1.2.缓存穿透的解决方案
-
黑名单:封禁ip,无法防御换ip;
-
存储空对象:查询失败的数据将存入Redis中。无法防御换key;
-
布隆过滤器:数据结构为位图(bitmap),通过下标记录了Redis和MySQL中的所有key。用户查询之前,先通过过滤器判断是否有这个key,如果有则允许查询。
2.缓存击穿 - 一个key失效瞬间
2.1.什么是缓存击穿
缓存中某个key失效的瞬间,大量请求并发涌入,所有请求都打向了MySQL数据库,没等到Redis重建缓存便已宕机。
假设某商品的缓存过期时间为4h,当时间恰好到达4h,缓存失效,此时仍有大量请求涌入服务器中等待处理,
而这些请求在处理时,判断缓存中没有数据,便进入MySQL进行查询,并尝试重建缓存。但由于这些请求都是并发的,成千上万的请求同时涌入MySQL,导致MySQL宕机。
2.2.缓存击穿的解决方案
-
实时监控:即将到期时,重置过期时间;
-
设置永不过期;
-
分布式锁:多线程并行访问时,第一个线程将抢到锁并重建缓存,其他线程没能抢到锁则进入休眠,待唤醒后从缓存中获取数据。
3.缓存雪崩 - 多个key同时失效瞬间
3.1.什么是缓存雪崩
缓存中大量key同时失效的瞬间,大量请求并发涌入,所有请求都打向了MySQL数据库,没等到Redis重建缓存便已宕机。
就是缓存击穿的升级版,n个key同时失效,就是n个缓存击穿同时发生。
3.2.缓存雪崩的解决方案
- 实时监控:即将到期时,重置过期时间;
- 设置永不过期;
- 随机失效时间:失效时间在固定范围内,但取范围内的随机值,有效避免大面积的Key同时失效。