缓存三大问题

穿透 · 击穿 · 雪崩 — 动态流程图解析

🌊 缓存穿透 (Cache Penetration)

核心定义

查询一个 根本不存在 的数据,缓存查不到、数据库也查不到。 每次请求都穿过缓存直打数据库,若恶意大量请求,数据库将被压垮。


危害 DB 被打爆,常见于爬虫/CC攻击伪造不存在ID

解决方案 ① 布隆过滤器拦截  ② 空值缓存(短TTL)  ③ 参数校验

点击「播放」查看请求流程动画

正常请求
恶意请求(不存在ID)
布隆过滤器拦截
空值缓存回写

⚡ 缓存击穿 (Cache Breakdown / Hotspot Invalid)

核心定义

一个 超热点 key 在高并发时突然过期,大量并发请求同时涌入数据库查询同一条数据。


危害 瞬间DB查询暴涨,与穿透不同的是:数据真实存在,只是缓存过期了

解决方案 ① 互斥锁/分布式锁(只让一个线程回源) ② 逻辑过期(不设真实TTL)

点击「播放」查看请求流程动画

并发请求
热点key过期
互斥锁
缓存重建

❄️ 缓存雪崩 (Cache Avalanche)

核心定义

大量缓存 key 同时集中过期,或者 Redis 服务宕机,导致大量请求直怼数据库,引发级联崩溃。


危害 DB 被海量并发压垮,整个系统级联失败,影响面远大于击穿

解决方案 ① TTL 随机化  ② 多级缓存  ③ 服务降级限流  ④ Redis 高可用集群

点击「播放」查看请求流程动画

缓存key集中过期
大量请求冲向DB
随机TTL保护
多级缓存兜底

📊 三大问题对比一览

维度 🌊 缓存穿透 ⚡ 缓存击穿 ❄️ 缓存雪崩
数据是否存在 ❌ 不存在 ✅ 真实存在 ⚠️ 大量存在
触发原因 查询不存在的ID 热点key突然过期 大量key同时过期 / Redis宕机
受影响范围 单个查询维度 单个热点key ⚠️ 全局大范围
并发特征 持续稳定打DB 瞬间并发峰值 持续大规模冲击
破坏力 🔴 高(可被攻击) 🟠 中高 🔴🔴 极高(系统崩溃)
核心解决方案 布隆过滤器
空值缓存
互斥锁
逻辑过期
TTL随机化
多级缓存+限流

💡 记忆口诀

🌊 穿透
查的数据压根不存在
缓存 miss → DB 也 miss
→ 每次都穿透到 DB
布隆/空值 挡住它
⚡ 击穿
热点key过期的一瞬间
N 个线程同时涌入 DB
→ 数据真实存在
加锁让一人回源
❄️ 雪崩
大量key同时失效 / Redis挂了
→ 海量请求压垮 DB
→ 系统级联崩溃
TTL随机 + 多级缓存

🌊 穿透 — 解决方案

  • 布隆过滤器:预加载所有合法ID,请求来了先过滤
  • 空值缓存:DB查不到也缓存null,设短TTL(60s)
  • 参数合法性校验:ID格式/范围校验,拒绝明显非法请求
  • 接口限流+黑名单:针对恶意IP限速

⚡ 击穿 — 解决方案

  • 互斥锁(SETNX):只有一个线程去DB重建,其他等待
  • 逻辑过期:key永不真实过期,在value里存expire时间,异步续期
  • 热点数据永不过期:业务层手动管理失效

❄️ 雪崩 — 解决方案

  • TTL随机化:过期时间加随机偏移量,避免集中失效
  • Redis高可用:主从+哨兵 / Cluster,防单点宕机
  • 多级缓存:本地缓存(Caffeine/Guava) 兜底
  • 服务降级+限流:Hystrix/Sentinel 熔断保护DB
  • 预热缓存:系统启动时预先加载热点数据