双写一致性 (Dual-Write Consistency) 探讨当数据同时存在于数据库 (如 MySQL) 和缓存 (如 Redis) 时,如何保证两者的数据同步。


核心挑战:为什么难以保持一致?

在更新数据时,数据库和缓存的操作不是原子的。无论先操作谁,只要第二步失败,就会导致数据不一致:

痛点场景根本原因最终后果
操作异常第二步(如删缓存)失败,主流程已返回缓存中永远是旧数据(脏数据)
并发冲突多个请求交错执行,后发的请求覆盖了先发的更新数据库与缓存数据版本不匹配
主从延迟缓存刚删完,读请求从从库读到旧数据并回填缓存被“脏数据”瞬间回填

解决方案概览

针对上述挑战,业界演进出了以下几种主流对策:

方案名称核心逻辑解决的痛点一致性级别适用场景
旁路缓存 (Cache Aside)先更 DB,再删 Cache降低冲突概率弱一致性大多数互联网业务 (推荐)
延迟双删 延迟再删主从延迟最终一致性主从延迟严重的架构
版本号/时间戳校验写入带版本,读取校验版本乱序写入最终一致性高并发、允许短暂不一致
异步补偿监听变更,重试删除操作失败最终一致性 (高可靠)高可靠、解耦需求
分布式读写锁强行串行化读写并发冲突强一致性金融等强一致场景

总结建议

  • 追求性能与最终一致性 (推荐):采用“先更 DB,再删缓存”模式。配合 TTL 过期机制 作为兜底,高可靠场景下引入 MQ 或 Binlog 异步重试

  • 追求强一致性:使用读写锁或直接查询数据库。

  • 追求性能与最终一致性 (推荐):采用“先更 DB,再删缓存”模式。配合 TTL 过期机制 作为兜底,高可靠场景下引入 MQ 或 Binlog 异步重试

  • 追求强一致性:使用读写锁或直接查询数据库。