知识卡片
缓存穿透击穿雪崩三种失效模式的区别与应对
内容
三种缓存”失效”问题常被混为一谈,但根因和应对完全不同。缓存穿透是查询 “根本不存在”的数据——数据库里没有,缓存自然也没有,每次都注定命中失败、 每次都要打到数据库,缓存形同虚设;可能是业务本身就有这类查询,也可能是 恶意构造不存在的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)
- 结论依据:原文分别定义缓存穿透(查询不存在数据)、缓存击穿(单个热点
失效引发并发涌入)、缓存雪崩(大批数据同时失效)三种现象,并各自给出
对应的应对手段,直接支撑本卡片的分类对比结构。
- 原始内容:这种查询不存在的数据的现象被称为缓存穿透……这种现象被称为
缓存击穿……这种现象被称为缓存雪崩。要避免缓存雪崩问题,通常会采取
下面三种办法:提升缓存系统可用性……启用透明多级缓存……将缓存的生存期
从固定时间改为一个时间段内的随机时间。