2025年Java面试宝典下载地址(建议收藏)
作为程序员在面试中被问到Redis缓存问题时,缓存穿透、雪崩、击穿是必考的三座大山。很多同学容易混淆这三者的区别,今天我们就用最通俗易懂的方式,结合真实项目经验,一次性讲透这三种场景的解决方案。

缓存穿透:如何拦截无效请求?
当查询数据库和缓存都不存在的数据时,这类无效请求就像拳头打在空气里,直接穿透缓存层打到数据库,这就是典型的缓存穿透场景。比如恶意攻击者故意请求不存在的用户ID。
解决方案可以分三个层面:
- 参数校验层:在API入口对ID范围做检查,比如用户ID必须大于0,手机号格式校验等
- 布隆过滤器拦截:将系统所有可能存在的数据哈希到足够大的bitmap中,查询时先过布隆过滤器,不存在直接返回
- 空值缓存策略:对确实不存在的key,设置短时间的空值缓存(建议设置30-60秒过期时间)
缓存雪崩:如何避免集体阵亡?
当大量缓存同时过期,就像雪山突然崩塌,瞬间的数据库请求洪峰可能导致系统崩溃。特别是在大促期间,商品缓存集中过期时最危险。
这里给出三个防御策略:
- 随机过期时间:基础过期时间上加随机值(比如30分钟±5分钟),避免集体失效
- 分级缓存架构:采用多级缓存策略(本地缓存+分布式缓存),本地缓存可以作为最后防线
- 热点数据永不过期:对特别重要的核心数据,可以设置逻辑过期时间,后台异步更新缓存

缓存击穿:如何守护热点数据?
某个热点key失效的瞬间,大量并发请求就像高压电击穿绝缘层,瞬间击穿缓存直达数据库。这种情况常出现在明星八卦、秒杀商品等场景。
应对方案建议用组合拳:
- 互斥锁排队:当缓存失效时,用分布式锁控制只有一个线程去重建缓存
- 逻辑过期时间:缓存value里保存逻辑过期时间,异步刷新避免集中过期
- 热点发现机制:通过监控系统识别热点数据,提前进行缓存预热
这里有个实战技巧:使用Redis的SETNX命令实现分布式锁时,记得设置合理的锁超时时间,避免死锁。同时建议将锁的value设为随机字符串,删除时进行校验防止误删。

需要重点提醒的是,这些解决方案要根据实际业务场景组合使用。比如电商系统的大促预案中,通常会同时采用布隆过滤器、分级缓存、热点发现三种机制形成立体防御。
最后给大家推荐个福利:如果准备面试需要系统复习Java知识体系,可以访问面试鸭返利网获取最新面试资料。通过本站购买面试鸭会员可享25元返利,点击下方链接直达:
立即获取返利资格
2025年Java面试宝典下载(含分布式、微服务等高频考点)


