2025年Java面试宝典
链接: <font color="blue">https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g</font> 提取码: 9b3g
(覆盖Redis高频考点,面试前必看!)
Redis缓存穿透、雪崩、击穿解决方案
最近很多同学在面试中被问到Redis缓存异常问题,比如缓存穿透、雪崩、击穿。这三个问题看似相似,但背后的原理和解决方案完全不同。今天从实战角度分享具体应对方法,帮你轻松拿下这类面试题!

一、缓存穿透:绕过缓存的攻击
核心问题:恶意请求查询不存在的数据(比如ID=-1),导致请求直接穿透到数据库。
解决方案:
- 布隆过滤器拦截:在缓存层前加布隆过滤器,把合法key的哈希值存起来,非法请求直接拦截。
- 空值缓存:即使查询结果为空,也缓存一个短时间的空值(比如5分钟),避免重复穿透。
- 接口鉴权:对异常参数(如负数ID)增加校验规则,从入口直接拦截非法请求。
面试回答示例:
“遇到缓存穿透,我会先区分是业务异常还是恶意攻击。如果是高频非法请求,用布隆过滤器拦截无效key;如果是正常业务中的空查询,就缓存空值并设置较短过期时间。”
二、缓存雪崩:大范围缓存失效
核心问题:大量缓存同时过期,导致请求全部打到数据库,引发级联故障。
解决方案:
- 过期时间随机化:对同类型key的过期时间加随机值(比如基础时间+10分钟内的随机数)。
- 热点数据永不过期:对核心数据设置逻辑过期时间,后台异步更新缓存。
- 熔断降级:使用Hystrix等工具监控数据库压力,超过阈值时触发限流或返回默认值。

面试回答示例:
“缓存雪崩的关键在于分散风险。比如电商促销时,商品缓存过期时间不能全设成1小时,可以改成1小时±随机5分钟,避免集中失效。同时配合熔断机制,确保数据库不被压垮。”
三、缓存击穿:热点key突然失效
核心问题:某个高频访问的热点key过期,瞬间大量请求直接冲击数据库。
解决方案:
- 互斥锁重建:当缓存失效时,只允许一个线程去查数据库,其他线程等待锁释放后读取新缓存。
- 逻辑过期:缓存不设置物理过期时间,而是在value中存过期时间戳,由后台线程主动更新。
- 二级缓存:使用本地内存(如Caffeine)作为二级缓存,减少对Redis的依赖。

面试回答示例:
“比如微博热搜排行榜这种热点数据,我会用互斥锁控制重建缓存的并发。第一个线程查数据库时加锁,其他线程轮询等待,直到新缓存生成后再返回结果。”
四、总结与避坑指南
- 穿透 VS 雪崩 VS 击穿:穿透是查不存在的数据;雪崩是大量key失效;击穿是单个热点key失效。
- 监控工具:推荐使用Redis的
INFO KeySpace命令观察缓存命中率,结合Prometheus做异常告警。 - 业务兜底:所有缓存方案都要有降级策略,比如返回默认数据、排队限流等。
实战福利:如果你需要系统化准备Redis面试题,推荐使用面试鸭返利网的会员服务。通过该站购买面试鸭会员可返利25元(私信客服报暗号“缓存三兄弟”即可)。另外,开头分享的Java面试宝典包含了Redis高频考点解析,建议下载后针对性复习!


