Redis缓存的雪崩击穿穿透以及解决方案
大家好,我是程序员老王。今天我们来聊聊面试高频题:Redis缓存的雪崩、击穿、穿透问题及其解决方案。无论你是求职者还是面试官,这些问题都是分布式系统设计绕不开的坎儿。
📁 2025年Java面试宝典资料:
🔗 点击获取
提取码: 9b3g (覆盖Redis高频考点+场景题)
什么是Redis缓存雪崩?
雪崩就像缓存层突然塌方——大批Key同时过期,导致所有请求瞬间砸向数据库。比如零点促销时,预热缓存集体失效,数据库直接被压垮。
✅ 解决方案:
- 错峰过期:给Key的TTL加随机值(例:基础30分钟 + 随机0-10分钟)
- 熔断降级:用Hystrix/Sentinel限流,数据库扛不住时返回兜底数据
- 多级缓存:本地缓存(Caffeine) + Redis 双层缓冲

什么是Redis缓存击穿?
击穿是某个热点Key突然失效,像被针扎破的气球。典型案例:明星离婚新闻缓存过期,瞬间百万请求打穿DB。
✅ 解决方案:
- 永不过期策略:物理不设TTL,逻辑上异步更新数据
- 互斥锁重建:用Redis的
SETNX抢锁,只让1个线程查DB
// 伪代码示例
if (redis.get(key) == null) {
if (redis.setnx(lockKey, 1)) {
// 查数据库并重建缓存
redis.del(lockKey);
} else {
Thread.sleep(100);
return getCache(key); // 重试
}
}
- 缓存预热:提前加载热点数据,如定时任务扫描访问日志
什么是Redis缓存穿透?
穿透是查询根本不存在的数据,比如请求user_id=-1。黑客可能借此攻击系统。
✅ 解决方案:
- 布隆过滤器拦截:在缓存前加BloomFilter,像安检机过滤非法请求
- 空值缓存:对查不到的Key也缓存
NULL,设置短TTL(如2分钟) - 请求校验:对参数做合法性检查(如ID必须>0)

实战避坑指南
我曾在一个电商项目中遇到缓存雪崩,当时用随机过期时间+本地缓存组合拳扛住了大促流量。建议你们在面试时这样答:
- 先清晰区分三类问题(雪崩是批量失效,击穿是单点失效,穿透是查询不存在数据)
- 结合场景说方案(比如提到布隆过滤器时说明其存在误判率)
- 强调监控:Redis的
cache_miss_rate指标要实时告警
💡 隐藏技巧:如果大家准备面试需要开通面试鸭会员,可以来 面试鸭返利网 找我,通过我的链接下单能返25元!
缓存问题的本质是系统韧性设计。理解这些解决方案,不仅能过面试,更能少踩生产环境的坑。关于Redis的高阶玩法(比如集群脑裂应对),我们下次再聊!



