2. 缓存一致性基础:缓存穿透、缓存击穿、缓存雪崩的定义与区别
在分布式缓存与数据库并存的架构中,缓存层与底层存储(如 MySQL、PostgreSQL)之间的数据一致性是系统稳定性的基石。然而,在高并发、高吞吐场景下,缓存层会暴露出三类经典异常现象:缓存穿透、缓存击穿 和 缓存雪崩。这三者虽然都表现为“缓存失效后请求直达数据库”,但其成因、影响范围及治理策略截然不同。本节将逐一剖析其定义,并通过对比表格与架构图厘清核心差异。
2.1 缓存穿透(Cache Penetration)
定义:查询一个根本不存在的数据。由于缓存中不存在该 key,请求直接穿透缓存层,每次都会落到数据库上。当恶意攻击或大量无效 key 并发请求时,数据库会承受巨大压力,甚至宕机。
- 核心特征:key 在缓存和数据库中均不存在。
- 典型场景:爬虫遍历不存在的商品 ID、黑客构造随机 ID 发起攻击。
- 危害:数据库连接数被打满,正常业务请求被阻塞。
关键指标:缓存命中率骤降(如从 95% 跌至 30%),数据库 QPS 飙升且无对应数据行返回。
2.2 缓存击穿(Cache Breakdown / Hotspot Invalid)
定义:一个热点 key 在缓存中过期失效的瞬间,大量并发请求同时访问该 key,由于缓存中无数据,所有请求全部穿透到数据库,导致数据库瞬时负载激增。
- 核心特征:key 在缓存中不存在,但在数据库中存在;且该 key 是热点数据。
- 典型场景:秒杀商品详情页、微博热搜词条在过期瞬间被大量用户刷新。
- 危害:单点 key 失效引发数据库局部过载,可能拖慢整个数据库实例。
注意:缓存击穿与穿透的本质区别在于——击穿的 key 在数据库中是真实存在的,只是缓存恰好过期;而穿透的 key 在数据库中根本不存在。
2.3 缓存雪崩(Cache Avalanche)
定义:在同一时刻,大量缓存 key 同时过期失效,或缓存节点整体宕机,导致海量请求直接涌入数据库,引发数据库连锁崩溃。
- 核心特征:多个 key(非单个)同时失效,或缓存层整体不可用。
- 典型场景:缓存服务重启、大量 key 设置了相同的过期时间(如凌晨 0 点统一过期)。
- 危害:数据库瞬间被击穿,引发级联故障,系统整体不可用。
经验值:生产环境中,缓存雪崩往往伴随着数据库连接池耗尽、慢查询堆积、CPU 使用率 100% 等连锁反应。
2.4 三者核心区别对比
| 对比维度 | 缓存穿透 | 缓存击穿 | 缓存雪崩 |
|---|---|---|---|
| 失效范围 | 单个 key(不存在) | 单个热点 key | 大量 key 或整个缓存层 |
| 数据库是否存在 | 否 | 是 | 是(部分 key 存在) |
| 根本原因 | 查询不存在的数据 | 热点 key 过期瞬间 | 大量 key 同时过期 / 缓存宕机 |
| 数据库压力特征 | 持续低命中率,压力均匀 | 瞬时尖峰,单点压力 | 瞬时海啸,全局压力 |
| 典型治理手段 | 布隆过滤器、空值缓存 | 互斥锁、逻辑过期、永不过期 | 过期时间加随机值、缓存高可用、限流降级 |
2.5 三类异常在缓存一致性测试中的表现
在《OpenTelemetry 采样策略优化缓存一致性测试链路》课程中,我们需要在测试链路中模拟并观测这三类异常,以验证采样策略能否准确捕获一致性偏差。下表总结了它们在测试链路中的典型表现:
| 异常类型 | 测试链路中的观测点 | OpenTelemetry 采样关注点 |
|---|---|---|
| 缓存穿透 | 数据库收到大量“查无此 key”的 SELECT 请求 | 采样器需识别“缓存未命中 + 数据库空结果”的 span 组合 |
| 缓存击穿 | 热点 key 过期后,数据库出现同一 SQL 的并发尖峰 | 采样器需对同一操作名的高并发 span 进行降采样或保留 |
| 缓存雪崩 | 数据库连接池瞬间打满,大量超时或错误 span 爆发 | 采样器需触发错误率告警并动态提升采样率 |
2.6 缓存穿透、击穿、雪崩的请求流向对比
下图从请求流向上直观展示三类异常的区别:穿透请求直接绕过缓存查询空数据;击穿请求在热点 key 过期瞬间穿透到数据库;雪崩请求则因大量 key 同时失效而集体穿透。
2.7 缓存一致性测试中的采样策略启示
在构建测试链路时,OpenTelemetry 采样器需要针对上述三类异常设计不同的采样规则:
- 穿透检测:对“缓存未命中 + 数据库空结果”的 span 组合进行全量采样,用于分析无效 key 的分布特征。
- 击穿检测:对同一热点 key 的并发 span 进行头部采样(Head Sampling),保留第一个请求的完整链路,后续请求降采样。
- 雪崩检测:当错误率或数据库延迟超过阈值时,动态切换为尾部采样(Tail Sampling),保留所有错误 span 用于根因分析。