缓存之双写一致性


前言

今天要写的是缓存之双写一致性问题(双写一致是指:缓存与数据库写入保持一致。),什么情况下会产生双写一致性问题,以及解决问题的方案。

一、数据库、缓存双写问题

1.先删除缓存再更新数据库

在缓存删除之后,数据库更新之前的间隙,又有人读取旧数据更新了缓存,数据库更新完数据库,此时数据库和缓存的数据又不一致了。

2.先更新数据库再删除缓存

通过调换顺序确实可以解决问题1,但是更新数据库成功,缓存删除失败还是会造成数据不一致问题。

二、解决方案

1.延时双删

先删除缓存,然后更新数据库,为了解决问题1,我们可以在更新数据库成功后加入一段延时删除代码(延时删除是为了给主从数据库同步时间,预估数据库全部更新后才删除缓存),可以通过睡眠线程来做再一次缓存删除操作,来达到缓存、数据库最终一致。(延时这段时间可能还是会出现缓存、数据库不一致)

2.消息队列

通过消息中间件的死信队列来做删除缓存的操作,每次需要清理缓存我们就把需要删除缓存的key丢入消息队列,再写一个删除缓存的消费者,删除成功就返回消费成功,删除失败就返回消费失败,删除失败的消息队列机制反复消费直到删除成功为止。

总结

上面说到的解决方案只是诸多方案之一,不管方案复杂还是简单可能都不能完美的解决这个问题,就像分布式的CAP理论,实际是无法做到同时满足CAP,但是我们可以跟BASE理论一样,我们可能无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值