Redis 缓存雪崩解决
时间:2026-10-6 07:39 作者:emer 分类: 无
Redis 缓存雪崩解决方案
缓存雪崩是 Redis 最常见的线上事故之一,搞懂怎么预防,关键时刻能救命。
1. 什么是缓存雪崩
大量缓存同时过期,或者 Redis 整个挂了,所有请求都打到数据库,数据库瞬间压力爆炸,直接崩溃。
就像雪崩一样,一层压一层,全完了。
2. 和缓存穿透、击穿的区别
穿透:查不存在的数据,缓存挡不住,一直打数据库。
击穿:一个热点 key 突然过期,瞬间大量请求打数据库。
雪崩:大量 key 同时过期,或者 Redis 挂了,整个数据库被打垮。
3. 解决方案一:过期时间加随机值
最常用的方法。不要所有 key 都设一样的过期时间,在基础时间上加随机数:
// 不好:所有 key 都 1 小时过期
$redis->setex('product:1', 3600, $data);
// 好:基础 1 小时,加 0-600 秒随机
$ttl = 3600 + rand(0, 600);
$redis->setex('product:1', $ttl, $data);
这样过期时间分散开,不会一起失效。
4. 解决方案二:热点数据永不过期
热点数据不要主动设过期,后台异步更新:
// 商品详情这种热点数据,不设过期
$redis->set('product:1', $data);
// 后台定时任务更新
// 不依赖过期时间,由程序控制刷新
5. 解决方案三:Redis 高可用
Redis 自己要高可用,不能单点:
- 主从架构 + 哨兵,主挂了自动切从
- Redis Cluster 集群,分片存储,一个节点挂了不影响全局
# Redis Sentinel 哨兵配置
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
6. 解决方案四:熔断降级
数据库撑不住的时候,要能自动降级:
- 限流:用令牌桶、漏桶算法,限制请求量
- 降级:返回默认数据或者"系统繁忙"
- 熔断:数据库连续报错多了,直接不访问数据库
常用工具:Sentinel、Hystrix。
7. 解决方案五:多级缓存
不要只靠 Redis 一层缓存:
用户请求 → 浏览器缓存 → CDN → Nginx 本地缓存 → Redis → 数据库
多级缓存,就算 Redis 挂了,前面还有 Nginx 缓存挡着。
8. 应急处理
真出问题了怎么办:
- 先限流,别让数据库被打死
- 恢复 Redis 服务
- 重新预热热点数据
- 慢慢放开流量
总结
缓存雪崩解决方案:
- 过期时间加随机值,别一起失效
- 热点数据永不过期,后台更新
- Redis 做高可用集群
- 加熔断限流兜底
- 多级缓存层层防护
记住这几点,缓存雪崩就不怕了。