Skip to content

Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么? ​

  • 标签:后端、Redis

🏛 业务架构师 ​

三者都是缓存失效引发的流量放大,区别在"失效的形态":

  • 缓存穿透:查根本不存在的数据(恶意伪造 ID、爬虫扫库)——缓存永远 miss,请求全打 DB。对策:布隆过滤器前置拦截(全量合法 ID 装入,不存在直接拒绝)+ 空值缓存(查无结果也缓存短 TTL,如 60s,防同一 key 反复穿透)+ 入参合法性校验;
  • 缓存击穿:单个热点 key 过期瞬间,海量并发同时回源(爆款商品缓存到期)——对策:互斥重建(只放一个请求去查库,其余等它回填)或逻辑过期(物理不过期,值里带过期时间,发现过期异步刷新,热点数据永不断供);
  • 缓存雪崩:大量 key 同时失效(批量导入同一 TTL)或 Redis 整体挂了——对策:TTL 加随机抖动(基础值+0~5min 随机)错峰过期;多级缓存(本地 L1 + Redis L2)+ 集群高可用;DB 侧限流熔断兜底(宁可部分请求失败,不能 DB 被打挂全站瘫痪)。

架构视角的三条原则:

  1. 按资损分级投入:商品详情页被打穿=体验劣化,用便宜方案(TTL 抖动+空值缓存);库存/价格查询被打穿=超卖资损,必须互斥重建+DB 乐观锁双保险——防护成本与业务价值对齐;
  2. 预案演练:这三件事都要在故障演练里注入(kill Redis、批量过期),验证兜底链路真的工作;
  3. 监控先行:缓存命中率、DB QPS 水位、Redis 连接数——命中率骤降是所有三类故障的共同前兆。

一句话:本质都是"缓存这个堤坝缺口时,流量洪峰直冲 DB"——方案就是拦(布隆)、疏(互斥/异步)、垫(多级/限流)。

🏗 系统架构师 ​

三个"缓存失效引发 DB 雪崩"的经典问题,我按定义 → 危害 → 方案讲:

缓存穿透(查不存在的数据):请求的 key 在缓存和 DB 都没有(恶意伪造 ID、爬虫扫库),每次都穿透到 DB。

  • 方案:布隆过滤器前置拦截(不存在的 key 直接返回);缓存空值(null 也缓存,短 TTL 30~60s);参数合法性校验 + 风控限流。

缓存击穿(某个热点 key 过期瞬间):千军万马同时重建缓存,DB 瞬间被同一条查询打爆。

  • 方案:互斥锁重建(拿到分布式锁的请求查库回填,其余等待/返回旧值);逻辑过期(物理不过期,value 里存过期时间,后台异步刷新);热点数据永不过期 + 定时刷新。

缓存雪崩(大面积 key 同时失效或 Redis 整体宕机):同一时刻大量 key 过期(如批量预热时统一 TTL),DB 压力陡增崩溃。

  • 方案:TTL 加随机抖动(基准 + 0~5 分钟随机,错峰失效);多级缓存(本地缓存兜一层);Redis 高可用(哨兵/集群)+ 熔断限流兜底;缓存预热错峰进行。

架构总结:穿透是"不存在的数据"→ 拦截 + 空值;击穿是"单点热点失效"→ 锁住重建;雪崩是"面状失效/整体故障"→ 随机化 + 高可用 + 限流兜底。三个问题共同的原则:DB 前面的每一层缓存都要设计"失效时的行为",而不是只设计命中时的性能。

💻 全栈开发专家 ​

三个"缓存失效类"问题,一句话区分:穿透是查不存在的数据,击穿是热点 key 过期,雪崩是大量 key 同时失效或实例宕机。

1. 穿透(请求的数据根本不存在):每次都打穿到 DB,恶意攻击常用不存在的 id。

  • 布隆过滤器前置:不存在的 key 直接拒绝;
  • 缓存空值:DB 查不到也缓存 null,短 TTL(60s);
  • 参数校验兜底:id 格式/范围非法直接拒绝。

2. 击穿(单个热点 key 过期瞬间大量请求同时回源):

  • 互斥锁回源:只放一个请求查 DB 重建,其他等待/返回旧值(SET NX 抢重建权);
  • 逻辑过期(我常用):value 里带过期时间字段,物理不过期;读到"已过期"就返回旧数据 + 异步线程重建——永远不阻塞用户:
java
if (data.logicalExpire < now) {
    if (redis.setIfAbsent("lock:rebuild:" + key, "1", 10, SECONDS)) {
        executor.execute(() -> rebuild(key));   // 异步重建
    }
}
return data.old;   // 先返回旧值

3. 雪崩(大量 key 同时过期 / 缓存宕机):

  • TTL 加随机偏移(基础 30min + 随机 0~10min)打散过期时间;
  • 高可用:主从 + 哨兵/Cluster 防实例级宕机;
  • 多级缓存(本地 Caffeine + Redis)+ 熔断限流,Redis 全挂时对 DB 限流保护。

总结记忆:穿透挡"假数据",击穿保"热 key",雪崩防"集体失效"。