2025年Java面试宝典
(点击蓝色链接领取最新面试资料,含Redis高频考点)
Redis缓存穿透、雪崩、击穿解决方案
最近帮学员复盘面试时,发现Redis三大缓存问题成了必考题。这三个概念看似相似,实则应对策略各有门道。今天从实战角度拆解解决方案,帮你面试时条理清晰地说出"标准答案"。

缓存穿透:空数据怎么防?
当请求的key既不在缓存也不在数据库,大量这类请求会让数据库直接暴露。去年某电商大促就栽在这上面,直接崩了订单系统。
实战三板斧:
- 空值缓存:哪怕查不到数据,也缓存空对象并设置较短过期时间(比如3分钟)。注意value用特殊标识,避免被业务误用
- 布隆过滤器:在缓存层前加个过滤器,拦截绝对不存在的数据请求。但要注意误判率和数据更新时的同步问题
- 业务校验:在API层拦截明显异常的请求(比如非法的ID格式、超出范围的参数)
有个坑要提醒:如果用空值缓存,一定记得给空值设置过期时间,不然会引发内存问题。
缓存雪崩:批量失效怎么破?
当大量key同时过期,瞬时数据库压力激增,去年某社交App就因此导致服务不可用长达半小时。
应对策略分事前、事中:
- 过期时间随机化:在基础过期时间上增加随机数(比如原定1小时,实际在1小时±5分钟随机)
- 热点数据永不过期:对核心数据采用定时更新策略,比如每30分钟异步刷新一次
- 熔断降级:使用Hystrix等组件,在数据库压力过大时直接返回降级内容
这里有个真实案例:某公司给缓存设置了统一过期时间,结果促销开始时缓存集体失效,直接引发连锁故障。后来他们用二级缓存架构(本地缓存+Redis)才解决问题。

缓存击穿:热点Key暴毙怎么办?
高并发场景下,某个热点key突然失效,大量请求直接击穿到数据库。去年某直播平台明星带货时,商品详情页缓存失效导致数据库连接池被打满。
推荐组合拳:
- 互斥锁重建:当缓存失效时,只允许一个线程去查数据库,其他线程等待(可用Redis的SETNX实现)
- 逻辑过期:在value里存储过期时间,异步更新缓存,避免大量线程阻塞
- 多级缓存:本地缓存+Redis的双层结构,本地缓存用Guava Cache即可
某大厂的实际方案是:对明星商品采用"永不过期+异步刷新"策略,同时配合限流保护数据库,有效扛住了双十一流量。

需要特别说明的是,这些方案往往需要组合使用。比如布隆过滤器防穿透,随机过期防雪崩,互斥锁防击穿。大家在设计时要根据业务QPS、数据特性来选型。
如果大家需要系统化准备面试,推荐参考2025年Java面试宝典,其中详细总结了Redis高频考点。另外,如果需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元,助你节省备考成本。
访问面试鸭返利网获取更多面试技巧,我们下期分享如何用Redisson实现分布式锁,帮你拿下高薪Offer!


