1. 课程导论:缓存一致性问题全景图与失效策略的核心价值

1.1 缓存一致性:分布式系统的“阿喀琉斯之踵”

在微服务与高并发架构中,缓存是提升性能的首选武器。然而,缓存与数据库之间的数据不一致问题,是导致线上故障、数据错乱、资损事故的头号技术债。缓存一致性并非单一技术问题,而是一组由更新时序、并发冲突、网络分区、中间件特性交织而成的复杂治理难题。

下图展示了缓存一致性问题的核心矛盾:当业务数据发生变更时,缓存中的旧数据与数据库中的新数据之间出现时间窗口,不同客户端可能读到不同版本的数据。

缓存一致性问题全景图 数据库 (MySQL) 缓存 (Redis) 应用服务 A 应用服务 B 客户端 1 (读) 客户端 2 (写) ⚠ 数据不一致时间窗口 核心矛盾: 数据库写入后,缓存未及时失效或更新,导致后续读请求命中旧数据。并发越高、链路越长,不一致概率越大。

1.2 六大典型不一致场景

根据生产环境故障复盘,缓存不一致问题可归纳为以下六类高频场景。理解这些场景是设计失效策略的前提。

场景编号 场景名称 触发条件 典型后果
S1 先删缓存,后写数据库 并发读请求在缓存删除后、数据库写入前填充缓存 缓存中为旧数据,数据库为新数据
S2 先写数据库,后删缓存失败 数据库写入成功,缓存删除操作因网络/超时未执行 缓存永久保留旧数据
S3 双写并发时序错乱 两个线程同时写数据库和缓存,后写缓存的线程覆盖了先写但更新的数据 缓存与数据库最终状态不一致
S4 主从延迟 + 缓存未失效 写入主库后立即读从库,从库尚未同步,缓存也未失效 读到旧数据(从库 + 缓存双重旧)
S5 批量操作部分失败 批量更新中部分 key 缓存删除失败,部分成功 缓存数据局部不一致,排查困难
S6 缓存穿透 + 并发回源 缓存失效瞬间大量请求同时回源查询数据库 数据库压力激增,回源数据可能不一致

关键洞察: 以上六种场景中,S1 和 S2 占生产故障的 70% 以上。失效策略的核心目标就是消除这两个场景带来的不一致窗口。

1.3 失效策略:从“被动淘汰”到“主动治理”

传统缓存失效策略(如 TTL 过期、LRU 淘汰)属于被动失效——缓存系统在内存不足或时间到期时自动删除数据。这种策略无法应对业务数据主动变更的场景。现代架构需要主动失效策略:当数据库发生写操作时,通过明确的契约和机制,主动通知缓存系统删除或更新对应数据。

失效策略的核心价值体现在三个维度:

  1. 一致性保障:通过“先写库、后删缓存”或“延迟双删”等模式,将不一致窗口从秒级压缩到毫秒级。
  2. 治理标准化:将失效行为从“代码隐性逻辑”提升为“OpenAPI 显式契约”,让上下游系统可观测、可测试、可审计。
  3. 故障自愈:结合重试、补偿、监控机制,在缓存删除失败时自动修复,避免数据永久不一致。
失效策略核心价值:从被动到主动 ❌ 被动失效(传统) • 依赖 TTL 过期,时间窗口不可控 • LRU 淘汰与业务语义无关 • 无主动通知机制 • 不一致故障定位困难 • 无法应对写操作密集场景 不一致窗口:秒级 ~ 分钟级 ✅ 主动失效(本课程) • 数据库写后立即触发缓存删除 • 支持延迟双删、异步补偿 • OpenAPI 契约显式定义失效行为 • 可观测、可测试、可审计 • 失败自动重试 + 补偿机制 不一致窗口:毫秒级 ~ 可忽略

1.4 本课程的技术栈与治理框架

本课程围绕 Redis + MySQL + Spring Boot 技术栈,以 OpenAPI 3.0 规范为契约载体,构建一套可落地的缓存一致性治理体系。整体框架分为四层:

层级 核心组件 职责
契约层 OpenAPI 规范 + 失效策略扩展字段 定义缓存失效的触发条件、目标 key、重试策略、补偿方式
执行层 失效策略引擎(延迟双删、异步删除、binlog 监听) 根据契约执行缓存失效操作,处理失败重试
观测层 失效事件日志 + 一致性指标 + 告警 记录每次失效操作的执行结果,监控不一致率
治理层 一致性巡检 + 补偿任务 + 人工介入 API 定期扫描不一致数据,触发自动或手动修复

课程目标: 学完本课程后,你将能够为任意业务系统设计一套“契约驱动、可观测、可自愈”的缓存失效策略,并通过 OpenAPI 规范将其标准化为团队共识。

1.5 本章小结

  • 缓存一致性问题的本质是数据库写入与缓存更新之间的时序冲突,在高并发场景下被放大。
  • 六大典型场景中,先删缓存后写库和写库后删缓存失败是最常见的故障根源。
  • 失效策略从被动淘汰演进为主动治理,核心价值在于将不一致窗口从秒级压缩到毫秒级,并通过契约实现标准化。
  • 本课程以 OpenAPI 契约 + 失效策略引擎 为核心,构建四层治理框架,覆盖定义、执行、观测、治理全链路。