知识卡片

缓存穿透击穿雪崩三种失效模式的区别与应对

结构图卡

内容

三种缓存”失效”问题常被混为一谈,但根因和应对完全不同。缓存穿透是查询 “根本不存在”的数据——数据库里没有,缓存自然也没有,每次都注定命中失败、 每次都要打到数据库,缓存形同虚设;可能是业务本身就有这类查询,也可能是 恶意构造不存在的Key发起攻击。前者解法是把”查询结果为空”也缓存一段时间 (区别于异常,异常不能被当空值缓存),插入新记录时主动清理;后者解法是 在缓存前加一层布隆过滤器,用最小代价判断某Key是否可能存在,判定不存在 直接拒绝,连缓存都不用查。缓存击穿是单个热点数据恰好失效的瞬间,大量 针对它的并发请求同时穿透到数据源——解法是以该Key为锁,只放第一个请求 去查数据源、其余请求阻塞或重试;或者干脆把这类热点数据交给代码手动管理 生命周期,不依赖缓存的自动失效策略。缓存雪崩是大批不同数据在短时间内 一起失效(常见于统一预热的数据有相同过期时间,或缓存服务崩溃重启)—— 解法是提升缓存集群本身的可用性、用透明多级缓存分散各节点的加载时间差异, 以及把固定过期时间改成一个区间内的随机值,从根源上打散”同时到期”。

结构图

flowchart TD
    A[缓存穿透: 查询根本不存在的数据] -->|业务性| A1[缓存空结果+主动清理]
    A -->|恶意攻击| A2[布隆过滤器提前拦截]
    B[缓存击穿: 单个热点数据失效瞬间] --> B1[加锁只放一个请求查数据源]
    B --> B2[热点数据代码手动管理生命周期]
    C[缓存雪崩: 大批数据同时失效] --> C1[提升缓存集群可用性]
    C --> C2[透明多级缓存分散加载时间]
    C --> C3[过期时间加随机扰动]

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第4章"透明多级分流系统" 4.6.2节"缓存风险"(源文件:_epub-src对应OEBPS/Text/chapter55.xhtml) - 结论依据:原文分别定义缓存穿透(查询不存在数据)、缓存击穿(单个热点 失效引发并发涌入)、缓存雪崩(大批数据同时失效)三种现象,并各自给出 对应的应对手段,直接支撑本卡片的分类对比结构。 - 原始内容:这种查询不存在的数据的现象被称为缓存穿透……这种现象被称为 缓存击穿……这种现象被称为缓存雪崩。要避免缓存雪崩问题,通常会采取 下面三种办法:提升缓存系统可用性……启用透明多级缓存……将缓存的生存期 从固定时间改为一个时间段内的随机时间。