2. 缓存一致性基础理论

在分布式缓存系统中,一致性是决定系统行为与可靠性的核心约束。本章从 CAP 理论与 BASE 理论出发,分析它们在缓存场景下的具体表现,并对比强一致性与最终一致性的适用边界。

2.1 CAP 理论在缓存场景下的应用

CAP 理论指出,分布式系统最多同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)中的两项。在缓存中间件中,网络分区是常态,因此必须在 C 和 A 之间做出权衡。

缓存场景下的 CAP 解读:
  • C(一致性):所有缓存节点在同一时刻返回相同的数据。写入缓存后,任何读取请求都能立即看到最新值。
  • A(可用性):每个请求都能获得非错误的响应,即使缓存节点故障或网络延迟,系统仍能返回数据(可能是旧数据)。
  • P(分区容错性):系统能容忍网络分区,即节点间通信中断时仍能继续运行。缓存集群必须支持 P。
CAP 理论在缓存场景下的三角关系 一致性 (C) 可用性 (A) 分区容错 (P) CP 系统:缓存写入后强一致,但分区时可能拒绝写入 AP 系统:缓存始终可读写,但可能返回旧数据 CA 系统:不分区时兼顾一致与可用,但分布式下不可行 缓存中间件必须选择 CP 或 AP 策略,无法同时满足三者
实践建议:大多数缓存场景选择 AP 系统(如 Redis 集群在分区时继续服务),但关键业务数据(如支付状态)应使用 CP 系统或引入外部一致性协调器。

2.2 BASE 理论在缓存场景下的应用

BASE 理论是对 CAP 中 AP 策略的延伸,强调基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)。缓存系统通常采用 BASE 思想来平衡性能与一致性。

BASE 要素 缓存场景含义 典型实现
基本可用 缓存节点故障时,系统降级返回旧数据或默认值,保证请求不失败 本地缓存 + 远程缓存双降级策略
软状态 缓存数据允许存在中间状态,不同节点可能持有不同版本的数据 多级缓存中各级数据版本号不一致
最终一致性 经过一定时间后,所有缓存节点最终会达到数据一致 异步刷新、TTL 过期、消息队列同步
注意:BASE 理论不保证实时一致性。在缓存更新后到最终一致前的窗口期内,应用层必须能容忍读取到旧数据。对于金融、库存等强约束场景,需要额外引入分布式锁或事务消息。

2.3 强一致性与最终一致性的区别与选择

强一致性和最终一致性是缓存一致性策略的两个极端。理解它们的差异是设计缓存一致性闭环的基础。

强一致性 vs 最终一致性:缓存写入流程对比 强一致性 1. 客户端写入主缓存 2. 同步复制到所有副本 3. 所有副本确认写入 4. 返回写入成功 最终一致性 1. 客户端写入主缓存 2. 立即返回写入成功 3. 异步同步到副本 4. 副本最终达到一致 强一致性牺牲可用性换取数据准确;最终一致性牺牲实时性换取高吞吐

2.3.1 核心区别对比

对比维度 强一致性 最终一致性
读取延迟 高,需等待所有副本确认 低,直接返回本地缓存值
写入延迟 高,同步复制阻塞 低,异步复制非阻塞
数据准确性 实时准确,无脏读 存在不一致窗口期
系统吞吐 低,受限于最慢副本 高,可水平扩展
故障容忍 弱,副本故障导致写入失败 强,副本故障不影响写入
典型协议 Paxos、Raft、ZAB Gossip、CRDT、TTL 刷新

2.3.2 选择策略

选择决策树:
  1. 业务是否允许读取到旧数据?
    • 不允许 → 使用强一致性(如分布式锁 + 同步复制)
    • 允许 → 使用最终一致性(如 TTL 缓存 + 异步刷新)
  2. 系统对写入延迟是否敏感?
    • 敏感 → 使用最终一致性,避免同步阻塞
    • 不敏感 → 可接受强一致性带来的写入延迟
  3. 缓存节点故障时是否允许降级?
    • 允许降级 → 最终一致性 + 本地缓存兜底
    • 不允许降级 → 强一致性 + 多副本冗余
混合策略:实际生产环境中,常采用“读写分离 + 最终一致性”方案。写操作直接更新数据库并异步刷新缓存;读操作优先读取缓存,缓存缺失时回源数据库并回填。对于关键数据,可在缓存更新后设置短暂锁(如 1 秒)强制读库,实现准强一致性。