Redis-2 双写一致性

  • 双写一致性

一.什么是双写一致性?

在数据库中的数据修改后,也要修改缓存中的数据,保证数据库与缓存中保存的数据一致。

二.如何保证双写一致性?

回答该问题一定要结合自己的项目,说明自己的项目是必须强一致性还是允许延迟一致。

针对必须强一致性的项目:

方案一.延迟双删

1.实施:依次执行操作:删除缓存——修改数据库——延时——删除缓存

2.为什么要两次删除缓存:

(1)第一次删除缓存是因为:修改数据库中的数据后,缓存中保存的相当于过期数据,所以删除。

(2)第二次删除是因为:假设线程1删除了缓存中的数据,但还未修改数据库中的数据;此时线程2得到了时间片去查询已经被删除的数据,由于缓存中的数据已经被删除,线程2会进行缓存重建,把数据库中的数据又重新写入缓存;当线程1重新获得时间片修改完数据库后,就会出现数据库与缓存中的数据不一致的情况,因此还需要再删除一次缓存。

3.为什么要延时:

通常情况下数据库采用主从模式,延时是为了等待数据库将数据从主节点同步到从节点。

方案二.分布式锁

1.使用两把锁:

(1)共享锁:又叫读锁readlock,加锁之后,其他线程可以共享读操作,但不能进行写操作。

(2)排他锁:又叫独占锁writelock,加锁之后,其他线程的读写操作都被阻塞。

2.使用:在进行读操作时添加共享锁,读读不互斥,写互斥;在进行写操作时添加独占锁,读写互斥。

针对允许延迟一致的项目:

方案一.使用消息队列MQ

1.实施:进行修改数据库操作后,会发送消息给MQ;缓存服务会监听MQ,收到数据库修改操作的信息后,会更新缓存,以此来保持数据的最终一致性。

方案二.使用Canal

1.实施:进行修改数据库操作后,数据库会将该操作记录到二进制日志文件binlog中,canal会监听数据库的binlog,发现修改操作后会通知缓存服务更新缓存,以此来保持数据的最终一致性。

2.优点:对业务代码几乎零侵入。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值