缓存雪崩的隐形杀手 —— 当批量过期遇上瞬时高并发
🏷️ Cache Stampede / Cache Avalanche当大量 Redis Key 被设置了相同或非常接近的过期时间时,在过期时刻到达的瞬间,这些 Key 会同时失效,导致原本由缓存承载的请求全部穿透到后端数据库,引发缓存雪崩(Cache Avalanche)。
Redis 采用惰性删除 + 定期删除双策略:
在设置过期时间时,给 TTL 加上一个随机值,使 Key 的过期时间分散开,避免同一时刻大量 Key 失效。
不设置过期时间,由后台线程定期刷新缓存。热点数据适合此方案。
引入多级缓存(L1 本地缓存 + L2 Redis 缓存),即使 Redis 缓存失效,本地缓存仍可挡住部分流量。
当缓存失效时,只允许一个线程去 DB 加载数据并重建缓存,其他线程等待或返回旧数据。
在缓存失效、DB 压力飙升时,通过限流降级保护后端系统。
| 方案 | 复杂度 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| TTL 随机偏移 | ⭐ 低 | 几乎所有场景 | 实现简单,效果显著 | 无法完全消除集中过期 |
| 永不过期 + 异步刷新 | ⭐⭐ 中 | 热点数据 | 用户无感知,零 miss | 需维护刷新逻辑,数据有延迟 |
| 多级缓存 | ⭐⭐⭐ 高 | 高可用系统 | 多层防护,极高可用 | 架构复杂,一致性难保证 |
| 互斥锁重建 | ⭐⭐ 中 | 单个热点 Key | 防缓存击穿 | 存在锁等待,吞吐受限 |
| 限流降级 | ⭐⭐ 中 | 兜底方案 | 保护后端,防止雪崩 | 用户体验降级 |
| 问题 | 原因 | 特征 | 核心方案 |
|---|---|---|---|
| 缓存雪崩 | 大量 Key 同时过期 / Redis 宕机 | 大面积缓存同时失效 | TTL 加随机 + 多级缓存 |
| 缓存击穿 | 单个热点 Key 过期 | 一个 Key 失效,大量请求穿透 | 互斥锁 + 永不过期 |
| 缓存穿透 | 查询不存在的数据 | 缓存和 DB 都没有 | 布隆过滤器 + 空值缓存 |
设置缓存 TTL 时,永远加一个随机偏移量 ——
这就像给每把锁配了不同的开门时间,
避免所有人同时挤进同一扇门。