2025年Java面试宝典点击下载
(网盘链接长期有效,建议保存备用)
Redis缓存击穿雪崩穿透是什么解决方案
最近面试中被问得最多的Redis三大缓存问题,今天咱们就站在程序员角度,用大白话聊聊缓存击穿、雪崩、穿透这三个"缓存杀手"到底是怎么回事,以及对应的解决方案。本文不会出现晦涩的源码,都是可以直接用在面试场景的实战经验。(文末有程序员专属福利哦)
什么是缓存击穿?如何解决?
缓存击穿就像演唱会黄牛票,某张"热门数据"突然失效,大量请求直接穿透到数据库。比如说电商首页的热门商品缓存过期瞬间,刚好遇到秒杀活动,数据库直接被压垮。
解决方案一:分布式锁排队
用Redis的setnx命令实现互斥锁,第一个请求重建缓存时加锁,其他请求等待或返回默认值。这里要注意设置合理的锁超时时间,避免死锁。
解决方案二:逻辑过期时间
给缓存数据增加一个逻辑过期字段,物理缓存设置为永不过留。当发现逻辑过期时,异步更新缓存,保证始终有可用数据。

缓存雪崩的预防策略
如果说击穿是单点失效,雪崩就是大规模缓存集体失效。比如所有商品缓存设置相同的1小时过期时间,某个整点同时失效导致数据库瞬间被打爆。
解决方案一:随机过期时间
在基础过期时间上增加随机数(例如30-40分钟),让缓存错峰失效。代码实现可以这样写:
redis.expire(key, baseTime + random.nextInt(10)*60)
解决方案二:服务熔断降级
当检测到数据库压力过大时,自动触发熔断机制。这时候可以直接返回静态数据或友好提示,保护后端系统。
需要特别说明的是,缓存雪崩场景可以配合二级缓存(本地缓存+Redis)来缓解压力。但要注意本地缓存的更新策略,避免出现数据不一致的情况。
缓存穿透的终极防御指南
缓存穿透比前两者更危险,因为这是持续攻击不存在的数据。比如用不存在的用户ID频繁请求,每次都会穿透缓存直达数据库。
布隆过滤器方案
在缓存层前面架设布隆过滤器,提前判断key是否存在。但要注意布隆过滤器存在误判率,且需要维护过滤器的更新机制。
空值缓存策略
对于查询结果为null的请求,仍然在Redis中缓存一个特殊值(如"NULL_FLAG"),并设置较短的过期时间(2-5分钟),避免被恶意利用。

综合防御体系建设
在实际项目中,建议采用组合拳:
- 热点数据永不过期+互斥锁更新
- 多级缓存架构(本地缓存+Redis)
- 请求限流&服务降级机制
- 监控系统实时报警
这里有个真实案例:某电商平台通过布隆过滤器+空值缓存,将穿透请求降低了98%,数据库QPS从峰值5万降到正常3千左右。
最后给程序员朋友们分享个小福利:需要购买面试鸭会员的同学,通过面试鸭返利网找我可返25元,相当于打七折。近期很多同学反馈说复习Redis时参考的《2025年Java面试宝典》不错,下载链接在文章开头,需要的自取~



