核心内容摘要
Git-RSCLIP快速上手:无需训练的自定义标签分类
MySQL 与 Redis 的双写一致性是缓存架构的核心难题。
由于网络延迟、故障回滚、并发竞态等因素两者只能追求最终一致性无法保证强一致性除非牺牲性能用分布式锁。
什么是双写一致性/* by
hk - online tools website :
hk/zh/barcode.html */ 在分布式系统中双写一致性主要指在一个数据同时存在于缓存如Redis和持久化存储如数据库的情况下 任何一方的数据更新都必须确保另一方数据的同步更新以保持双方数据的一致状态。
这一问题的核心在于如何在并发环境下正确处理缓存与数据库的读写交互防止数据出现不一致的情况。
解决方式
旁路缓存 Cache-Aside最常用/* by
hk - online tools website :
hk/zh/barcode.html */ 读操作先从缓存中查若命中则直接返回若未命中从数据库中查并放入缓存中。
写操作先更新数据库然后删除缓存。
优点实现简单适合大多是读多写少的场景。
缺点存在短暂数据不一致的场景。
如刚更新数据库还未删除缓存时读取数据就会读到旧数据。
优化对热点数据使用读写锁或互斥锁。
如redis的setnx。
延时双删延时双删主要用于解决高并发场景下由于网络延迟并发控制等原因造成的数据不一致的情况。
第一次删除更新数据库后删除缓存。
第二次删除隔一段设定好的暂停时间后再次删除。
优点解决脏数据概率。
缺点需维护定时任务增加系统复杂度。
删除缓存重试机制执行更新数据库操作之后删除缓存若删除失败系统进入重试逻辑按照预先设定的策略进行多次尝试 直到删除成功或达到最大次数。
优点确保删除缓存成功。
缺点占用额外的系统资源和时间重试次数过多可能阻塞其他操作。
消息队列异步同步写操作成功后发送消息到MQ消费MQ更新或删除缓存。
通过MQ解耦数据库和缓存操作保证最终一致性。
支持异步重试。
如RabbitMQ的死信队列。
优点高吞吐解耦系统。
缺点依赖MQ可靠性需处理消息积压和重复消费。
分布式锁写操作前获取分布式锁如redis的RedLock 更新数据库-删除缓存-释放锁 串行化写操作避免并发冲突。
优点保证强一致性。
缺点性能差锁粒度控制困难。