双写一致性问题如何解决

双写一致性问题如何解决

大前提

先读缓存,如果缓存中没有的情况下,才从数据库中读取

更新策略

1、先更新缓存,再更新数据库(不可取)

2、先更新数据库,再更新缓存(不可取)

3、先删除缓存,再更新数据库(不可取)

4、先更新数据库,再删缓存(可取,有问题)

1、先更新缓存,再更新数据库

这种情况下,如果说先更新缓存然后更新数据库失败,那么读到的数据就是错误的数据

2、先更新数据库,再更新缓存

对于这种情况

假设有两个线程A.B同时进行更新操作,

(1)线程A更新了数据库

(2)线程B更新了数据库

(3)线程B更新了缓存

(4)线程A更新了缓存

这种出现请求A更新缓存应该比B 要更新的早,但是因为网络的原因,B先更新缓存,这就导致了脏数据,因此不考虑

3、先删除缓存,再更新数据库

这种情况下会发生如下:

假设有两个线程A,B

(1)线程A请求写的操作,首先删除了缓存

(2)线程B来查询发现缓存没有

(3)线程B到数据库中读取,由于此时线程A还没有进行写的动作,所以B读到的就是旧值,B又将自己读到的写入缓存中

(4)线程A将新值写入数据库

对于这种,可以采用延时双删策略

(1)先淘汰缓存

(2)再写数据库(这两步和原来一样)

(3)休眠一秒,再淘汰缓存

这么一秒内所造成的脏数据再次删除

4、先更新数据库,再删缓存

最好的办法,但是也存在并发问题

比如说两个请求A,B A做查询操作,B做更新操作,会发生如下情况

(1)缓存刚好失效

(2)A查询数据库得到了一个旧值

(3)请求B将新值写入数据库

(4)请求B删除缓存

(5)请求A将读到的旧值写入缓存

发生这种情况的概率有多少

​ 步骤三的写数据库比步骤二的读数据库时间更短,才有可能让步骤四先与步骤五,但是一般情况下数据库的读操作远快于数据库的写操作,因此这一情况下很难出现

Redis双写一致性问题是指在使用Redis集群时,当进行写操作时,由于数据的复制存在一定延迟,可能会导致数据不一致的情况。这种情况在以下场景中尤为常见: 1. 主节点写入后,备份节点尚未完成复制:当主节点执行写操作后,备份节点需要一定时间才能完成数据的复制。在这段时间内,如果主节点宕机或者网络发生故障,备份节点可能无法完全复制数据,导致数据不一致。 2. 主节点写入后,备份节点复制过程中失败:备份节点在复制数据过程中也可能发生故障,例如网络中断或者节点故障。这样一来,主节点写入的数据将无法正确复制到备份节点上,导致数据不一致。 为了解决Redis双写一致性问题,可以采取以下几种措施: 1. 使用Redis Sentinel:Redis Sentinel是Redis提供的高可用性解决方案,通过监控和自动故障转移来确保Redis集群的可用性。当主节点发生故障时,Sentinel会自动选举新的主节点,并将写操作重定向到新的主节点上,从而保证数据的一致性。 2. 使用Redis Cluster:Redis Cluster是Redis提供的分布式解决方案,它将数据分片存储在多个节点上,通过数据分片和复制机制来提供高可用性和数据一致性。在Redis Cluster中,每个主节点负责多个槽位的数据,备份节点会自动复制主节点的数据,确保数据的一致性。 3. 使用同步复制:在一些特定场景下,可以使用Redis的同步复制机制来提高数据的一致性。同步复制会等待所有备份节点都完成复制后才返回写操作的成功响应,确保所有节点都有相同的数据。 需要注意的是,以上措施可以提高Redis的数据一致性,但并不能完全解决所有情况下的数据不一致问题。在一些极端情况下,例如网络分区、多节点同时故障等,可能仍然存在数据不一致的可能性。因此,在设计应用程序时,需要根据实际需求和业务场景来选择适当的解决方案,并进行必要的数据容错和异常处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值