1. 课程导论:缓存一致性问题概述、TCC模式简介、课程目标与学习路径

1.1 缓存一致性问题的本质

在分布式系统中,缓存与数据库之间的数据不一致是导致业务故障的头号隐患。当应用同时读写缓存(如 Redis)和数据库(如 MySQL)时,由于两者是独立的存储系统,任何一次写操作都可能在时间窗口内造成数据差异。

核心矛盾:缓存追求低延迟(微秒级),数据库追求持久化与事务性(毫秒级)。两者在写入顺序、回滚能力、隔离级别上的天然差异,使得“先写库还是先写缓存”成为经典难题。

典型的缓存一致性问题场景包括:

场景 操作顺序 不一致后果
缓存穿透 查询未命中缓存 → 查库 → 回写缓存 高并发下大量请求直接打到数据库
缓存击穿 热点 key 过期 → 并发查库 数据库瞬时压力激增
缓存雪崩 大量 key 同时过期 → 全部查库 数据库被打垮
双写不一致 先写库后写缓存 / 先删缓存后写库 读到旧数据或丢失更新

其中,双写不一致是本课程关注的核心。传统解决方案(延迟双删、订阅 binlog 异步同步)只能降低不一致概率,无法在分布式事务层面保证最终一致性。

缓存不一致典型场景:双写时序冲突 双写不一致时序冲突 应用线程 A 应用线程 B 数据库 + 缓存 写库 写库 写缓存 写缓存 写缓存 旧数据 缓存最终存储了线程 A 的旧数据,覆盖了线程 B 的新数据 → 后续所有读请求都读到过期值

1.2 为什么需要 TCC 模式

TCC(Try-Confirm/Cancel)是分布式事务领域的一种补偿型方案,最初用于跨库转账、订单拆分等场景。将其引入缓存一致性领域,是因为它提供了明确的边界控制:

  • Try 阶段:预留资源,锁定缓存与数据库的中间状态
  • Confirm 阶段:确认提交,将预留状态转为最终一致
  • Cancel 阶段:回滚释放,撤销 Try 阶段的所有预留操作

相比传统“先删缓存再写库”或“先写库再删缓存”的脆弱策略,TCC 模式在缓存场景中具备以下优势:

对比维度 传统延迟双删 binlog 异步同步 TCC 模式(本课程)
一致性保证 概率性最终一致 最终一致(秒级延迟) 强最终一致(毫秒级)
回滚能力 无 需额外补偿脚本 内置 Cancel 回滚
缓存利用率 频繁删除导致命中率下降 依赖 binlog 时效 Try 阶段保留缓存
实现复杂度 低 中 中高(需定义接口)
适用场景提示:TCC 模式最适合对一致性要求高、且缓存更新频率可控的业务,如库存扣减、账户余额、订单状态变更。不适合纯读多写少或缓存仅做加速的场景。

1.3 课程目标与学习路径

本课程旨在帮助你建立从理论到实战的完整知识体系,最终能够独立设计并落地基于 TCC 的缓存一致性方案。

课程三大目标

  1. 理解边界:掌握缓存一致性的问题边界与 TCC 模式的核心原理
  2. 掌握设计:学会在缓存场景中定义 Try、Confirm、Cancel 三阶段接口
  3. 落地实战:基于 Spring Boot + Redis + MySQL 实现可运行的 TCC 缓存一致性框架

学习路径(30 章结构)

阶段 章节范围 核心内容
基础篇 第 1–6 章 缓存一致性理论、TCC 模式原理、分布式事务基础
设计篇 第 7–15 章 接口定义、状态机设计、幂等与防悬挂、超时与补偿
实现篇 第 16–24 章 Spring Boot 集成、Redis 锁与事务、MySQL 本地事务编排
进阶篇 第 25–30 章 性能调优、监控与告警、生产案例复盘
TCC 三阶段在缓存场景的抽象流程 TCC 模式在缓存场景的三阶段抽象 Try 阶段 预留缓存 + 锁定数据库行 Confirm 阶段 提交缓存 + 提交数据库 Cancel 阶段 回滚缓存 + 回滚数据库 三阶段在缓存场景的职责 • Try:在缓存中写入“预留标记”(如状态=UPDATING),数据库行加乐观锁 • Confirm:将缓存标记清除并写入新值,数据库提交事务 • Cancel:删除缓存预留标记,数据库回滚行记录

1.4 前置知识与工具准备

为获得最佳学习效果,建议你具备以下基础:

  • 熟悉 Java 语言及 Spring Boot 基础开发
  • 了解 Redis 基本数据结构(String、Hash)与过期策略
  • 了解 MySQL 事务与行锁机制
  • 了解分布式 CAP 理论与 BASE 原则
注意:本课程所有实战代码均基于 JDK 17 + Spring Boot 3.x + Redis 7.x + MySQL 8.x。如果你使用更低版本,部分 API 可能需要适配。

现在,让我们正式进入缓存一致性的世界,从 TCC 模式中寻找那个精确的“一致性边界”。