如何保证缓存和数据库数据的一致性 ?

一、CAP理论


CAP理论是分布式系统设计中的一个重要原则,它指出对于一个分布式系统,不可能同时满足以下三个特性:

一致性(Consistency):所有节点在同一时刻看到的数据是一致的。

可用性(Availability):每一个请求必须得到响应,哪怕返回的是旧数据

分区容忍性(Partition Tolerance):系统在网络分区时,仍能够继续运行

根据CAP理论,一个分布式系统只能同时满足其中的两个特性。在实际应用中,分区容忍性是不可避免的,因此通常需要在一致性和可用性之间进行权衡。


二、缓存不一致处理

如果不是并发特别高,对缓存依赖性很强,其实一定程序的不一致是可以接受的。但是如果对一致性要求比较高,那就得想办法保证缓存和数据库中数据一致。

缓存和数据库数据不一致常见的两种原因:

  • 缓存key删除失败

  • 并发导致写入了脏数据


三、保证缓存和数据库数据的一致性的以下方案


1、消息队列保证key被删除

可以引入消息队列,把要删除的key或者删除失败的key丢尽消息队列,利用消息队列的重试机制,重试删除对应的key。


2、数据库订阅 + 消息队列保证key被删除

可以用一个服务(比如阿里的 canal)去监听数据库的 binlog日志,获取需要操作的数据。然后通过 Springboot业务代码 订阅程序传来的信息,进行缓存删除操作。


3、延时双删防止脏数据(延时双删保证了数据的最终一致性)

还有一种情况,是在缓存不存在的时候,写入了脏数据,这种情况在先删缓存,再更数据库的缓存更新策略下发生的比较多,解决方案是延时双删。


简单说,就是在第一次删除缓存之后,过了一段时间之后,再次删除缓存。


这种方式的延时时间设置需要仔细考量和测试。


设置缓存过期时间兜底

这是一个朴素但是有用的办法,给缓存设置一个合理的过期时间,即使发生了缓存数据不一致的问题,它也不会永远不一致下去,缓存过期的时候,自然又会恢复一致。


延迟一段时间原因(为了让其它线程把旧数据先写入缓存后再删除):为了保证步骤5的将旧数据写入缓存操作完毕后,再执行步骤6的删除缓存操作

若出现步骤6删除缓存操作,优先于步骤5的将旧数据写入缓存操作,则会出现缓存与数据库的不一致性


注意:延时双删会存在一次数据的不一致性

posted @ 2024-11-07 23:02  jock_javaEE  阅读(76)  评论(0)    收藏  举报