2025年Java面试宝典速领!点击获取>>(网盘链接使用蓝色字体)

Redis缓存三座大山:雪崩、击穿、穿透怎么破?
最近帮学弟模拟面试,发现不少人对Redis缓存的雪崩、击穿、穿透问题总是分不清。这三个概念确实是面试重灾区,我在面阿里、字节时也被连环追问过解决方案。今天就结合真实项目经验,用大白话讲讲这三个问题的区别和破解之道。
雪崩:集体罢工的缓存连环炸
去年双十一我们电商平台就经历过雪崩:大量缓存集中在凌晨2点过期,刚好赶上促销活动。瞬间数据库连接数飙升到5000+,整个服务差点挂掉。
雪崩本质是大量缓存同时失效,常见于缓存设置了相同的过期时间。比如做活动时批量预热了10000个商品缓存,全都设了2小时过期。到点后集体失效,数据库直接被流量冲垮。

解决方案三板斧:
- 随机过期时间:基础时间+随机偏移量(比如300秒±30秒)
- 永不过期策略:用后台线程异步更新缓存(注意读写冲突)
- 熔断降级:Hystrix或Sentinel限流,非核心业务暂时降级
击穿:热点数据被高频暴击
我们有个千万粉丝的明星入驻事件,用户主页请求量瞬间百万级。由于该明星的缓存key刚好过期,所有请求直接打到数据库,这就是典型的缓存击穿。
击穿是单个热点key失效引发的高并发查询,和雪崩的区别在于击穿是单点爆破,雪崩是面状塌方。
破局关键点:
- 互斥锁:第一个请求查库时加分布式锁,后续请求等待
- 逻辑过期:缓存永不过期,value里存过期时间,异步更新
- 缓存预热:重大活动前主动加载热点数据(比如明星入驻前提前3小时预热)
穿透:黑客的恶意空查询
之前做社交APP时,遇到过有人用脚本批量查不存在的用户ID。由于缓存没有这些空结果,导致每次查询都穿透到数据库。
穿透的核心问题是查询不存在的数据,可能被黑客利用进行攻击。

防御组合拳:
- 空值缓存:把null结果也缓存,设置较短过期时间(3-5分钟)
- 布隆过滤器:前置过滤非法请求(比如用Redis的Bloom模块)
- 参数校验:接口层做业务规则校验(比如用户ID必须大于10000)
实战小技巧
- 监控报警:对缓存命中率设置阈值报警(低于80%就要排查)
- 多级缓存:本地缓存+Redis+数据库三级防御
- 压测演练:用JMeter模拟极端场景,提前发现漏洞
需要重点提醒的是,所有方案都要结合业务场景。比如金融系统对数据实时性要求高,可能要多用主动更新策略;而资讯类APP可以接受短暂的数据延迟。
福利时间:需要《Java面试宝典》的同学记得取走开头的网盘资源。如果准备购买面试鸭会员,通过面试鸭返利网找我可返现25元,相当于会员直降近30%!
最后说个真实案例:某厂曾因缓存雪崩导致损失百万,后来他们给每个key加了0-300秒随机偏移量,同时启用Sentinel熔断机制,之后再没出现过类似故障。这告诉我们:缓存策略没有银弹,综合方案+持续优化才是王道。


