首页/数据/数据库速查/缓存雪崩(大面积同时失效/宕机)
Redis 运维与场景124 条

缓存雪崩(大面积同时失效/宕机)

两类雪崩:大批键同一时刻过期、缓存层整体不可用;前者用 TTL 抖动与分批预热,后者靠多级缓存、限流熔断与高可用架构。

数据库速查数据更新于 2026-10-13

缓存雪崩是什么

雪崩指同一瞬间大面积缓存同时失效,回源流量瞬间涌向数据库:一类是大批键在同一时刻过期,另一类是缓存层整体不可用(实例宕机、主从全部失效、大 key 阻塞导致请求超时)。本质是「同一个瞬间大家都没缓存」,因此防护重点是让回源流量可控,而不是单点优化缓存本身。

基本信息

触发原因批量键同刻过期、缓存层宕机、大 key 阻塞
直接后果数据库连接与 QPS 被打满,业务整体不可用
主要手段TTL 抖动、多级缓存、回源限流、熔断降级
架构手段哨兵或 Cluster 多副本,避免缓存单点
补充手段发布或重启后分批预热,避免冷启动冲击

典型使用场景

  • 批量写入缓存时:给同批数据的 TTL 加随机抖动,避免同刻到期
  • 大促与大流量前:提前分批预热热点数据,不等到用户请求来触发
  • 缓存重启后:先补一批热点再放全量流量进来
  • 数据库保护:对回源流量设并发上限与排队,宁可慢不可垮
  • 依赖降级:缓存不可用时读本地缓存或返回兜底内容
  • 监控告警:对回源 QPS、缓存命中率设置突降告警

TTL 抖动与分批预热

TTL 抖动与分批预热
import random
base = 600
ttl = base + random.randint(-120, 120)   # 600 加减 120 秒的随机抖动
redis.set(key, value, ex=ttl)

# 批量预热时分批进行,避免一次性压满缓存与数据库
# for chunk in chunks(keys, 100):
#     warmup(chunk)
#     time.sleep(0.1)

# 热更新时的推荐顺序:先写库,再删缓存,等回源自然加载

防护措施对照

措施作用局限
TTL 抖动把过期时间打散,避免同刻失效对整体宕机无效
多级缓存本地缓存顶住短暂不可用容量小,数据一致性更难
回源限流保护数据库不被打垮部分请求要排队或失败
熔断降级快速失败并返回兜底数据用户看到降级内容
多副本高可用降低缓存层整体失效概率增加成本与运维复杂度
雪崩的本质是「同一个瞬间大家都没缓存」:无论是过期还是宕机,都要让回源流量可控,这是最后一道闸门。
缓存层挂掉时最危险的动作是全量流量直接压向数据库:应先限流再恢复缓存,或直接进入降级模式返回兜底数据,避免缓存恢复后数据库已被打垮。

易错点

  • 批量写入缓存用统一 TTL,到点集体失效把数据库打满
  • 缓存实例单节点部署,宕机后没有任何降级路径
  • 只做缓存高可用不做回源限流,缓存恢复瞬间的雪崩仍会击穿数据库
  • 缓存重启后立刻放全量流量,冷启动回源把数据库压垮
  • 命中率突降没有告警,雪崩已经发生才发现

数据来源与参考

  • Redis 官方文档: 使用模式
  • 缓存雪崩治理实践

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌