Redis缓存雪崩的解决方案:面试必考的技术要点

2025年Java面试高频题集:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
什么是Redis缓存雪崩?
缓存雪崩是指大量缓存数据在同一时间失效,导致所有请求瞬间穿透到数据库,引发数据库压力激增甚至宕机。举个典型场景:如果系统设置了1000个缓存Key都在凌晨0点过期,恰逢高峰期流量涌入,Redis查不到数据就会集体请求数据库——这就是缓存雪崩。
方案一:随机过期时间分散风险
核心逻辑:不让所有Key同时过期
// 原始写法(危险)
redis.set(key, value, EXPIRE_TIME); // 所有Key固定30分钟过期
// 优化方案(安全)
int baseExpire = 1800; // 基础30分钟
int randomExpire = baseExpire + new Random().nextInt(300); // 增加0-5分钟随机值
redis.set(key, value, randomExpire);
效果:将缓存雪崩转化为平缓的缓存穿透,数据库承压能力提升5-10倍
方案二:多级缓存架构兜底
层级设计:
- L1:Redis Cluster(分布式缓存)
- L2:本地缓存(Caffeine/Ehcache)
- L3:分布式锁(控制数据库访问)

执行流程:
- 请求先查Redis,未命中则查本地缓存
- 本地缓存未命中时,用Redisson加分布式锁
- 仅第一个线程查数据库并回写,其余线程等待
- 数据库返回后同步更新多级缓存
方案三:熔断降级+热点永不过期
组合策略:
graph TD
A[请求进入] --> B{Redis是否存在?}
B -- 存在 --> C[返回数据]
B -- 不存在 --> D{是否触发熔断?}
D -- 是 --> E[返回默认数据]
D -- 否 --> F[查询数据库]
热点数据保护:
// 异步刷新热点Key
void refreshHotKey(String key) {
String value = loadFromDB(key);
redis.set(key, value); // 不设过期时间
// 每隔10分钟异步更新
schedule(() -> refreshHotKey(key), 10, MINUTES);
}
缓存重建防雪崩的工程实践
- 监控预警:
- 配置Zabbix监控缓存命中率
- 当命中率低于70%触发企业微信告警
- 灰度发布:
- 使用Redis Cluster分片存储
- 每次只更新1/3的实例缓存
- 数据库防护:
- HikariCP连接池设置maxWait=500ms
- MySQL启用线程池限制并发请求数
面试场景应答技巧
当面试官问:"如何处理Redis缓存雪崩?"建议按以下逻辑回答:
- 先明确定义(证明理解基础概念)
- 分层次说明解决方案:
- 预防阶段:过期时间分散
- 发生阶段:多级缓存兜底
- 恢复阶段:熔断降级
- 结合项目经验举例:
"我们电商项目在双11前通过给商品缓存增加±15%的随机过期时间,成功扛住了零点流量洪峰"
薅会员福利:
如果你正在备战技术面试,偷偷告诉个小秘密👉 通过 面试鸭返利网 购买面试鸭会员可立减25元!覆盖阿里/腾讯/美团等大厂真题,省下的钱还能加杯奶茶~
[返回首页]
(每天前20名下单额外送算法刷题手册)


