redis缓存——双写一致

         双写一致性是指当修改了数据库中的数据的同时需要更新缓存数据,保持缓存和数据库数据一致性。

        延时双删可以在某种程度上有效的避免缓存、数据库数据的不一致的问题,但依旧存在有脏数据风险,此方法可以大大降低产生脏数据的方向,但是无法避免产生脏数据。

        如上图所示,不管是先删除缓存,在操作数据库,还是说先操作数据库,再删除缓存,都会造成读写不一致的情况。

         添加分布式锁(互斥锁)、读写锁可以有效解决以上问题,

         由上图可以看出,添加分布式锁后,当线程1写数据操作完成并且释放锁以后,线程2才可以开始执行,因此,这种方法有效的保证的数据的强一致性,但性能会比较低。

        针对以上分布式锁出现的问题,我们可以对此进行优化,一般情况下,针对缓存中的数据都有读多写少的特点,针对此特点,我们可以通过读写锁来控制。读写锁分为共享锁和排他锁两种,其中共享锁(读锁)是指当一个线程进行加共享锁,其他线程可以进行读操作,但不能写;排他锁(独占锁)加锁后会阻塞其他线程的读和写操作。相比分布式锁,此方法在性能上有了较大的提升,同样可以保证数据的强一致性。

  

添加读锁的源码

添加写锁的源chu

采用异步通知 

        使用MQ中间中间件,更新数据后,通知缓存删除。

        利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值