2025年Java面试宝典新鲜出炉!点击领取👉
(网盘链接长期有效,建议保存到个人空间)
Redis缓存的雪崩、击穿、穿透以及解决方案

什么是缓存雪崩?怎么救场?
缓存雪崩就像早高峰地铁站突然停电——所有请求瞬间涌向数据库。当大量缓存集中在同一时间集体失效,或者Redis集群宕机时,数据库会被流量压垮。去年我们团队就遇到双十一零点商品列表缓存过期,MySQL直接被打崩。
解决方案要给缓存过期时间加上随机数,比如原本30分钟的缓存,分散在25-35分钟之间失效。这里有个小技巧:用基础过期时间 + 随机分钟数的方式,既能保证更新时效,又避免集体失效。如果是集群故障,记得提前部署哨兵模式或者集群模式,快速切换主节点。
缓存击穿怎么破?
大家应该都经历过这种场景:热搜明星的微博突然被删,几千万用户不停刷新空页面。这就是典型的缓存击穿——某个超级热点的key失效后,海量请求直接穿透到数据库。
这时候就要用互斥锁方案。当第一个请求发现缓存失效时,立即获取分布式锁,只有拿到锁的线程才能查询数据库,其他请求等待锁释放后直接读取重建好的缓存。代码层面可以用Redisson的tryLock实现,注意要设置合理的锁超时时间,防止死锁。
缓存穿透的防御姿势
去年黑产团伙用脚本随机生成不存在的商品ID刷我们接口,导致数据库持续高压。这就是缓存穿透,恶意请求根本不存在的key,绕过缓存直达数据库。
解决方案有三板斧:
- 接口层增加参数校验,比如ID必须符合特定规则
- 布隆过滤器预存所有合法key,拦截非法请求
- 对不存在的key也缓存空值,但记得设置较短过期时间(建议5分钟)

组合拳实战方案
实际生产环境中,建议采用分级防御策略:
- 第一层:Nginx限流,阻止异常流量
- 第二层:本地缓存(Caffeine)做二级缓存
- 第三层:Redis集群+读写分离
- 最后防线:数据库连接池扩容+慢SQL监控
这里有个容易踩的坑:使用布隆过滤器时,记得用Redisson的RBloomFilter,它自带数据持久化和集群支持,比手动维护过滤器省心得多。当需要添加新key时,记得双写数据库和布隆过滤器。
彩蛋福利
说到面试准备,刚整理好的《2025Java面试宝典》已经上传网盘:
点击领取👉
包含Redis高频考点和场景题解析,建议重点看分布式锁实现方案和集群运维章节。

需要购买面试鸭会员的同学注意啦!通过面试鸭返利网下单可额外返现25元,相当于用VIP价格买到SVIP服务。最近有学员用这个返利优惠,直接把三年的面试指导服务都包了,性价比直接拉满。
最后提醒各位开发者,缓存问题一定要在压测阶段充分验证。可以用JMeter模拟缓存失效场景,观察降级策略是否生效。遇到数据库扛不住时,别忘了配置快速失败机制,保护核心服务才是第一要务。


