如何保证缓存和数据库数据的一致性 ?
一、CAP理论
CAP理论是分布式系统设计中的一个重要原则,它指出对于一个分布式系统,不可能同时满足以下三个特性:
一致性(Consistency):所有节点在同一时刻看到的数据是一致的。
可用性(Availability):每一个请求必须得到响应,哪怕返回的是旧数据
分区容忍性(Partition Tolerance):系统在网络分区时,仍能够继续运行
根据CAP理论,一个分布式系统只能同时满足其中的两个特性。在实际应用中,分区容忍性是不可避免的,因此通常需要在一致性和可用性之间进行权衡。
二、缓存不一致处理
如果不是并发特别高,对缓存依赖性很强,其实一定程序的不一致是可以接受的。但是如果对一致性要求比较高,那就得想办法保证缓存和数据库中数据一致。
缓存和数据库数据不一致常见的两种原因:
- 
缓存key删除失败 
- 
并发导致写入了脏数据 
三、保证缓存和数据库数据的一致性的以下方案

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

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


3、延时双删防止脏数据(延时双删保证了数据的最终一致性)
还有一种情况,是在缓存不存在的时候,写入了脏数据,这种情况在先删缓存,再更数据库的缓存更新策略下发生的比较多,解决方案是延时双删。
简单说,就是在第一次删除缓存之后,过了一段时间之后,再次删除缓存。


这种方式的延时时间设置需要仔细考量和测试。
设置缓存过期时间兜底

这是一个朴素但是有用的办法,给缓存设置一个合理的过期时间,即使发生了缓存数据不一致的问题,它也不会永远不一致下去,缓存过期的时候,自然又会恢复一致。
延迟一段时间原因(为了让其它线程把旧数据先写入缓存后再删除):为了保证步骤5的将旧数据写入缓存操作完毕后,再执行步骤6的删除缓存操作
若出现步骤6删除缓存操作,优先于步骤5的将旧数据写入缓存操作,则会出现缓存与数据库的不一致性
注意:延时双删会存在一次数据的不一致性
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号