Redis缓存穿透和缓存雪崩问题解决方案

2025年Java面试宝典最新版已上传,速存!
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
一、缓存穿透:数据库的“空查询攻击”
缓存穿透是指请求的数据既不在缓存中,也不在数据库中。恶意攻击者可能利用这一点频繁查询不存在的数据,导致请求直接穿透缓存打到数据库,最终拖垮系统。
解决思路:
- 空值缓存:即使数据库返回空结果,也将其缓存并设置较短的过期时间(如5分钟)。这样后续的重复请求可以直接命中缓存,减少数据库压力。
- 布隆过滤器:在缓存层前加一层布隆过滤器,预先存储所有合法数据的Key。请求到达时,先检查布隆过滤器,如果不存在则直接返回,无需查询缓存或数据库。

二、缓存雪崩:缓存的“集体罢工”
缓存雪崩是指大量缓存数据在同一时间过期失效,导致所有请求瞬间涌向数据库,造成数据库崩溃。例如,某电商平台凌晨0点所有促销商品缓存同时失效,引发数据库查询量暴增。
解决方案:
- 随机过期时间:为不同Key设置差异化的过期时间(例如基础值+随机数),避免同时失效。
- 热点数据永不过期:对核心数据(如首页商品列表)采用“逻辑过期”策略,后台异步更新缓存。
- 服务降级与熔断:当数据库压力过大时,暂时拒绝非核心请求,优先保障核心功能可用。
三、缓存击穿:热点的“精准打击”
缓存击穿是缓存雪崩的特例,指某个超高并发的热点Key突然过期,大量请求直接穿透到数据库。
应对方法:
- 互斥锁:第一个请求未命中缓存时,通过分布式锁控制只有一个线程查询数据库并回填缓存,其他线程等待后重试。
- 逻辑过期+异步更新:缓存不设置物理过期时间,而是记录一个逻辑过期时间,由后台线程定期检测和更新。

四、真实面试场景如何回答?
如果面试官问到缓存问题,可以按以下逻辑组织答案:
- 明确问题定义:先说清楚穿透、雪崩、击穿的区别。
- 分层递进解决方案:从缓存层、数据库层、服务层的不同策略展开。
- 结合实际案例:比如提到电商秒杀场景中如何用互斥锁避免击穿。
加分项:
- 提到监控和报警机制,例如缓存命中率低于阈值时触发预警。
- 对比Redis和本地缓存的组合使用(如Caffeine+Redis)。
友情提示:如果你需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元!更多面试资料和实战经验,欢迎访问 面试鸭返利网 获取~


