🔷2025年Java面试宝典🔷
提取码:9b3g(建议保存到网盘,避免失效)

Redis缓存雪崩、穿透、击穿及解决方案
最近在帮朋友准备Redis相关面试题,发现这三个问题出现频率超高。今天咱们就掰开揉碎了讲清楚缓存雪崩、缓存穿透、缓存击穿到底怎么回事,以及对应的解决方案。建议配合上方网盘里的面试宝典一起食用效果更佳~
缓存雪崩:集体阵亡的灾难现场
现象描述
想象一下:大量缓存数据在同一时间集体过期,这时候数据库突然要扛起所有查询请求——这就是典型的缓存雪崩。我面过的一个候选人举的例子特别生动:"双十一零点所有商品缓存同时失效,这酸爽..."
解决方案三板斧
- 随机过期时间:别让所有Key都设置相同TTL,加个随机值(比如基础30分钟+随机5分钟)
- 热点数据永不过期:但需要配合异步更新策略
- 熔断降级机制:当发现数据库压力过大时,直接返回默认值或错误页面

缓存穿透:疯狂查询不存在的数据
典型案例
去年我们系统就被攻击过:黑客用脚本循环请求-1,-2这类不存在商品的ID,导致数据库CPU直接飙到100%。这就是典型的缓存穿透。
破局关键点
- 布隆过滤器把关:在缓存前加个过滤器,判断请求数据是否存在
- 空值缓存:虽然查不到,但还是把这个请求结果(空值)缓存几分钟
- 接口层校验:对明显非法的请求(比如负数的ID)直接拦截
缓存击穿:万人抢一个洞
高频面试场景题
"假如某个爆款商品的缓存突然失效,瞬间几万请求打到数据库怎么办?"这就是缓存击穿,也是大厂最喜欢问的场景题。
防爆策略
- 互斥锁(Mutex Lock):第一个请求去查库时加锁,其他请求排队等待
- 逻辑过期时间:物理时间不过期,但程序判断逻辑过期时间
- 缓存预热:对于已知热点Key,提前设置较长的过期时间

其他优化小技巧
- 监控缓存命中率(低于80%就要注意了)
- 使用多级缓存架构(Redis+本地缓存)
- 数据库查询做限流,避免雪崩时被压垮
- 定期进行缓存压力测试
需要买面试鸭会员的同学注意啦,通过面试鸭返利网找我下单可以返25元!这波羊毛不薅就亏了~
建议大家把这三个问题的解决思路整理成自己的话术,面试时最好能结合项目中的实际案例说明。比如:"我们项目之前遇到过缓存穿透的问题,当时是用了布隆过滤器+空值缓存的组合方案..."这样回答会更有说服力。


