2026/2/26 7:11:30
网站建设
项目流程
选择网站建设公司,数字媒体艺术就业方向,做配资网站,上海企业建设网站【Java 开发日记】 MySQL 与 Redis 如何保证双写一致性#xff1f;#xff08;2026 年主流实践版#xff09;
在真实生产环境中#xff0c;“双写一致性”几乎从来没有做到过强一致性#xff08;事务级原子性#xff09;#xff0c;绝大多数公司最终追求的都是最终一致…【Java 开发日记】MySQL 与 Redis 如何保证双写一致性2026 年主流实践版在真实生产环境中“双写一致性”几乎从来没有做到过强一致性事务级原子性绝大多数公司最终追求的都是最终一致性 可接受的不一致窗口。下面按一致性强度从弱到强复杂度从低到高排序列出目前2026年最主流的几种方案以及它们的适用场景、优缺点、残留风险和真实落地建议。1. Cache-Aside旁路缓存 先更新 DB再删缓存目前 80% 公司默认首选写流程 1. 更新 MySQL 2. 删除 Redis key不管成功与否都返回成功 读流程 1. 先读 Redis命中 → 返回 2. 未命中 → 读 MySQL → 回写 Redis → 返回为什么删缓存而不是更新缓存更新缓存需要把整个对象序列化回去复杂对象特别麻烦并发场景下“谁后写谁覆盖”问题很难解决删除更简单失败了靠过期兜底残留风险 概率排序从高到低风险场景概率日常不一致窗口解决/缓解办法更新 DB 成功删 Redis 失败★★★☆☆直到 key 过期加重试 记录失败 key 到延迟队列重试读写并发经典脏读案例★★☆☆☆几百 ms ~ 几秒延迟双删见方案2主从读写分离 从库延迟★★☆☆☆主从延迟时间延迟双删 sleep 时间包含主从延迟极端网络抖动/Redis 挂了★☆☆☆☆永久直到重启监控 告警 降级读 DB2026 真实建议绝大多数中型项目就只用这个合理过期时间1~30分钟根据业务热点调整已经够用。加一个**“删缓存失败重试表/队列”** 就能覆盖 99% 的场景。2. Cache-Aside 延迟双删最常见的加强版写流程 1. 删除 Redis第一次删 2. 更新 MySQL事务提交 3. sleep(500ms ~ 2s) // 经验值读接口平均耗时 主从延迟预估 4. 再次删除 Redis第二次删为什么能大幅降低脏数据概率第二次删把“读-写-读”并发中读请求在第一次删后、MySQL提交前回写的旧值删掉了。缺点sleep 时间很难精确主从延迟抖动、网络抖动增加了写接口的响应时间2026 真实做法sleep 时间一般设500ms ~ 1500ms或者改成发延迟消息到 MQ推荐// 伪代码TransactionalpublicvoidupdateUser(UserVOvo){// 1. 先删可选redis.delete(key);// 2. 更新 DBuserMapper.update(vo);// 3. 发延迟消息RocketMQ / Kafka 延迟队列rocketMQTemplate.sendDelayMsg(delay-delete-topic,key,1000);// 延迟1秒}// 消费者收到消息后再删一次RocketMQMessageListener(topicdelay-delete-topic)publicvoidonDelayDelete(Stringkey){redis.delete(key);}这样写接口不阻塞还更可靠。3. 基于 Binlog / CDC 的异步更新目前大厂主流终极方案代表组件Canal MQ、Debezium、Maxwell、阿里云 DTS等流程业务只更新 MySQL不碰 RedisMySQL Binlog 订阅 → 解析变更 → 发 MQ或直接推 Redis消费者收到变更 → 删除/更新对应 Redis key优点业务代码几乎无侵入不用关心缓存天然支持读写分离、主从延迟最终一致性窗口很小通常秒级缺点引入额外中间件运维复杂度↑Binlog 订阅有延迟几十 ms ~ 几秒需要处理幂等、顺序消费、断点续传2026 主流组合推荐规模推荐方案备注小中型Cache-Aside 延迟消息双删性价比最高中大型先更新 DB 删缓存 失败重试加个重试表或死信队列大型/高要求Canal / Debezium → RocketMQ/Kafka → 消费删缓存最稳业务无感极致强一致Rockscache / 分布式事务 标记删除极少数金融、对账场景快速决策表2026 年版业务特点推荐方案一致性级别复杂度读多写少、允许几秒不一致Cache-Aside 先更新DB再删缓存 过期最终一致★☆☆☆☆写比较频繁有脏读投诉延迟双删sleep 或延迟MQ最终一致更好★★☆☆☆主从读写分离严重延迟双删 MQ延迟消息最终一致★★★☆☆要业务无侵入、规模很大Binlog 订阅 → MQ → 删/更新缓存最终一致秒级★★★★☆金融级、对账必须几乎零差错Rockscache / 2PC 版本号 / 标记删除接近强一致★★★★★一句话总结最实用版大多数项目先更新数据库 → 删缓存 合理过期时间 删失败重试进阶一点把第二次删改成发延迟消息再往上走直接订阅 Binlog 做异步更新业务代码彻底不管缓存你当前项目属于哪一档是已经有脏数据投诉了还是想提前做预防可以告诉我更多场景我帮你选最合适的落地方案。