Redis mysql 双写一致性

意思是 当数据库数据更新时,redis中的缓存数据和数据库中的数据怎么保存一致;

 

第一种方案:先更新再删除缓存。

缺点:先更新,其他线程来拿数据会产生脏数据,而且可能会重复阐述缓存

第二种方案: 先删除缓存再更新。

缺点:删除缓存之后,在更新期间如果其他线程要来取数据,发现缓存没了,去数据库取旧值,再更新到缓存里面。这样会产生脏数据,并且产生脏数据之后,之后取得一直是脏数据。

 

两种方案比较 都有很大的缺陷,但是第二种方案可以改进,第一种方案没法改进。

 

第二种方案改进版: 先删除缓存,再更新,更新之后再删除缓存。

采用两次删除缓存的机制,来避免第二种方案产生脏数据之后,之后取得的一直是脏数据的问题。该方法产生的脏数据只能是更新期间的脏数据。

缺点:更新期间还是会产生脏数据;第二次删除可能不成功。

 

二次改进:采用消息队列 把第二次删除key的消息放到消息队列,保证一定能删除。

缺点:还是没有改变,更新期间产生的脏数据.

 

最终方案:

当数据更新的时候,在缓存中保存一个更新的标志位(类似于id),然后开始更新,当更新期间,其他线程过来拿数据,发现该数据处在更新阶段,就加入一个队列等待取数据,设置等待时间,期间队列头不断轮询数据是否更新完毕。如果在等待时间内数据没有更新完毕,就拿缓存数据,如果数据更新完毕,就取新数据。

eg:数据更新完毕之后,更自己去更新缓存,等待的线程直接去拿缓存就ok

具体流程: A线程更新数据时,会在缓存数据上加一个表示位,表示该数据正在更新,B线程过来取值,发现标示位,设置等待时间进入队列等待,不断轮询缓存,看标示位是否取消,如果期间A线程更新完毕,会更新缓存去除标示位,B线程轮询到直接拿缓存;如果没有更新完毕,就拿缓存中的旧值。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值