3. 缓存基础概念回顾:缓存穿透、击穿、雪崩、一致性、TTL与淘汰策略

在集成测试覆盖缓存冒烟检查之前,必须统一团队对缓存核心故障模式与治理手段的认知。本章从五个关键维度展开:缓存穿透、缓存击穿、缓存雪崩、缓存一致性以及TTL与淘汰策略。这些概念是设计冒烟检查用例的理论基础。

3.1 三大缓存故障模式

缓存穿透、击穿、雪崩是缓存层最常见的三类故障,其成因、影响范围与应对策略各不相同。下表从定义、典型场景与检查要点三个维度进行对比:

故障模式 定义 典型场景 冒烟检查要点
缓存穿透 请求查询一个根本不存在的数据,缓存与数据库均无命中,导致每次请求都穿透到数据库。 恶意攻击、非法参数(如 id = -1) 检查空结果是否被缓存(布隆过滤器或空值缓存)
缓存击穿 某个热点 key 在缓存失效的瞬间,大量并发请求同时回源数据库。 秒杀商品详情、爆款文章 检查热点 key 是否设置逻辑过期或互斥锁
缓存雪崩 大量 key 在同一时间批量失效,或缓存节点宕机,导致请求全部落到数据库。 缓存服务重启、统一过期时间 检查 TTL 是否添加随机偏移、是否启用本地缓存兜底
冒烟检查提示: 迁移后的缓存冒烟必须覆盖上述三种场景的防御机制是否生效。例如,使用不存在的 key 发起请求,观察是否触发数据库查询;对热点 key 执行缓存失效操作,观察是否出现回源尖刺。

3.2 缓存一致性

缓存一致性指缓存中的数据与数据库中的数据保持同步的程度。在 OpenAPI 迁移场景中,缓存一致性是冒烟检查的核心关注点之一。根据业务对一致性的容忍度,通常分为以下三种模型:

  • 强一致性: 缓存与数据库实时同步,写入后立即读取到最新值。实现成本高,通常依赖分布式事务或同步双写。
  • 最终一致性: 允许短暂的不一致窗口,经过一定时间后数据自动对齐。常见实现方式为异步消息队列 + 缓存失效。
  • 弱一致性: 缓存数据可能长期落后于数据库,适用于非关键数据(如用户头像、静态配置)。

在冒烟检查中,需要验证缓存更新策略是否正确执行。以下为常见的缓存更新模式对比:

更新模式 操作顺序 一致性风险 冒烟检查方法
Cache Aside 读缓存 → 未命中读 DB → 写缓存;写 DB → 删除缓存 删除缓存与写 DB 非原子,可能读到旧数据 并发读写同一 key,验证最终一致性
Read/Write Through 缓存代理层统一处理读写 缓存层故障可能导致数据丢失 模拟缓存节点宕机,检查数据完整性
Write Behind 异步批量写入 DB 宕机时可能丢失未落盘数据 强制 kill 缓存进程,检查 DB 数据是否完整

3.3 TTL 与淘汰策略

TTL(Time To Live)控制缓存数据的有效时长,淘汰策略决定缓存空间满时如何驱逐旧数据。两者共同决定了缓存系统的内存利用率与命中率。

3.3.1 TTL 设计原则

  • 差异化 TTL: 热点数据设置较短 TTL(如 1~5 分钟),冷数据设置较长 TTL(如 1~24 小时)。
  • 随机偏移: 在基础 TTL 上增加 ±10%~30% 的随机值,避免大量 key 同时过期引发雪崩。
  • 逻辑过期: 不设置物理 TTL,而是由业务代码在缓存 value 中嵌入过期时间,异步刷新。

3.3.2 常见淘汰策略

策略名称 淘汰逻辑 适用场景 冒烟检查关注点
LRU 淘汰最近最少使用的 key 访问模式有明显热点 热点 key 是否被错误淘汰
LFU 淘汰访问频率最低的 key 访问频率分布不均匀 频率统计是否准确
FIFO 淘汰最早进入缓存的 key 数据时效性要求高 是否淘汰了仍在使用的 key
TTL 淘汰即将过期的 key 缓存空间紧张 TTL 设置是否合理
冒烟检查建议: 在迁移后的缓存环境中,通过压测工具模拟缓存空间满的场景,观察淘汰策略是否按预期执行,以及是否出现大量缓存 miss 导致数据库压力骤增。

3.4 缓存故障模式与防御机制关系图

下图展示了缓存穿透、击穿、雪崩三种故障模式与对应的防御机制之间的映射关系,帮助理解冒烟检查用例的设计逻辑:

缓存故障模式与防御机制关系图 缓存故障模式与防御机制关系图 缓存穿透 缓存击穿 缓存雪崩 查询不存在的数据 热点 key 瞬间失效 大量 key 同时过期 布隆过滤器 空值缓存 参数校验 互斥锁 逻辑过期 热点 key 永不过期 TTL 随机偏移 本地缓存兜底 缓存集群高可用 冒烟检查要点: 1. 穿透:发送不存在 key,检查是否返回空值缓存而非穿透到 DB 2. 击穿:并发请求热点 key,检查是否只允许一个线程回源 3. 雪崩:批量设置 TTL 并重启缓存,检查数据库是否出现瞬时高峰 4. 一致性:并发读写同一 key,验证最终一致性窗口是否符合预期

3.5 缓存一致性检查流程

在 OpenAPI 迁移后的冒烟检查中,缓存一致性验证通常遵循以下步骤:

  1. 准备测试数据: 在数据库中插入一条测试记录,确保缓存中不存在该记录。
  2. 触发缓存加载: 通过 OpenAPI 查询该记录,触发缓存写入。
  3. 更新数据库: 直接修改数据库中的该记录(模拟外部系统变更)。
  4. 验证缓存失效: 检查缓存是否被正确删除或更新(取决于更新策略)。
  5. 验证最终一致性: 等待预设的同步窗口时间,再次查询 OpenAPI,确认返回最新数据。
常见陷阱: 在缓存一致性检查中,如果缓存更新策略为“先删缓存,再写数据库”,在删除缓存后、写数据库前,另一个线程可能读取到旧数据并重新写入缓存,导致缓存与数据库长期不一致。冒烟检查应覆盖此类并发场景。

3.6 本章小结

缓存穿透、击穿、雪崩是缓存系统最常见的三类故障,分别对应不存在数据、热点 key 失效和批量 key 过期三种场景。缓存一致性模型决定了数据同步的严格程度,TTL 与淘汰策略则控制缓存的生命周期与空间利用率。在后续章节中,我们将基于这些基础概念,设计具体的缓存冒烟检查用例,覆盖迁移后的 OpenAPI 缓存层。