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 同时失效而集体穿透。

缓存穿透、击穿、雪崩请求流向对比图 缓存穿透 / 击穿 / 雪崩 请求流向对比 客户端请求 缓存层 数据库 穿透:key 不存在 缓存未命中(空) 数据库空结果 击穿:热点 key 过期 缓存过期(无数据) 数据库返回真实数据 雪崩:大量 key 过期 缓存批量失效 数据库海啸压力 三类异常的核心区别 • 穿透:key 在缓存和数据库均不存在,请求直达数据库查空 • 击穿:热点 key 过期瞬间,大量并发请求穿透到数据库查真实数据 • 雪崩:大量 key 同时过期或缓存宕机,请求集体穿透导致数据库崩溃

2.7 缓存一致性测试中的采样策略启示

在构建测试链路时,OpenTelemetry 采样器需要针对上述三类异常设计不同的采样规则:

  • 穿透检测:对“缓存未命中 + 数据库空结果”的 span 组合进行全量采样,用于分析无效 key 的分布特征。
  • 击穿检测:对同一热点 key 的并发 span 进行头部采样(Head Sampling),保留第一个请求的完整链路,后续请求降采样。
  • 雪崩检测:当错误率或数据库延迟超过阈值时,动态切换为尾部采样(Tail Sampling),保留所有错误 span 用于根因分析。