首页 >文档 > redis缓存穿透缓存击穿缓存雪崩区别和解决方案

redis缓存穿透缓存击穿缓存雪崩区别和解决方案

Redis缓存穿透、缓存击穿和缓存雪崩是Java面试高频考点,也是实际开发中必须解决的性能问题。缓存穿透指查询不存在的数据导致频繁访问数据库,可通过布隆过滤器和空值缓存解决;缓存击穿是热点数据突然失效引发并发请求,建议使用互斥锁和永不过期策略;缓存雪崩则是大批量缓存同时失效,采用随机过期时间和缓存预热来应对。想获取完整《2025Java面试宝典》和更多大厂真题解析,可访问面试鸭返利网(mianshiyafanli.com)领取资料,通过专属链接购买会员还可返现25元。

2025年Java面试宝典下载地址 (提取码:9b3g)
想要领取完整面试资料的同学,可以到 面试鸭返利网(mianshiyafanli.com) 找到我的返利专属通道,购买面试鸭会员可返现25元!

面试鸭返利网

Redis缓存穿透、缓存击穿、缓存雪崩的区别和解决方案

Redis作为高频面试考点,"缓存三兄弟"(缓存穿透、缓存击穿、缓存雪崩)几乎是必问题。很多同学容易混淆这三个概念,今天我们从真实生产场景出发,帮你彻底理清它们的区别和应对方案!


缓存穿透:查不到的数据疯狂请求

问题场景:假设攻击者用大量不存在的数据ID(比如-1、0等无效值)疯狂请求,Redis里查不到,数据库里也没有,导致每次请求都穿透缓存直接打到数据库。

面试鸭返利网

解决方案

  1. 空值缓存:即使数据库查不到,也在Redis里存个空值(比如"NULL"),并设置较短的过期时间(比如3分钟)
  2. 布隆过滤器:在缓存层前加布隆过滤器,判断请求参数是否可能存在,不存在直接返回
  3. 接口限流:对异常参数(如负数ID)的请求进行限流或直接拦截

缓存击穿:热点数据突然失效

问题场景:某个热点数据(比如首页推荐商品)缓存过期瞬间,大量并发请求同时涌入,直接击穿缓存打到数据库,导致数据库压力激增。

解决方案

  1. 永不过期:对真正热点的key设置逻辑过期时间(比如value里存过期时间),后台异步更新
  2. 互斥锁:当缓存失效时,只允许一个线程去查数据库更新缓存,其他线程等待
  3. 二级缓存:使用本地缓存(如Caffeine)做一级缓存,Redis做二级缓存

缓存雪崩:大批量缓存集体失效

问题场景:大量缓存设置了相同的过期时间,同时失效导致所有请求瞬间涌向数据库,引发连锁故障。

面试鸭返利网

解决方案

  1. 随机过期时间:在基础过期时间上增加随机数(比如30分钟±5分钟)
  2. 缓存预热:在流量低谷期提前加载热点数据
  3. 服务降级:当检测到数据库压力过大时,返回默认值或排队提示
  4. 集群高可用:采用Redis Cluster模式保证部分节点故障时仍可用

面试加分技巧

回答这类问题时,建议按以下结构组织答案:

  1. 先说三者定义差异(穿透是查不存在的数据,击穿是单个热点失效,雪崩是批量失效)
  2. 再分别说明解决方案,重点突出"空值缓存"、"互斥锁"、"随机过期"等关键词
  3. 最后补充实际生产中的组合策略(比如布隆过滤器+互斥锁+随机过期)

需要准备更多大厂真题的同学,可以到 面试鸭返利网(mianshiyafanli.com) 获取最新的《Java面试突击手册》,通过我的专属链接购买会员还能返现25元!

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

🎯 立即加入面试鸭会员 →

今日有支付宝大红包赶快领,手慢无

支付宝红包二维码

支付宝扫码领取1-8元无门槛红包

支付宝红包二维码