关于缓存与数据双写一致性问题(清晰易懂)

12 篇文章 2 订阅
本文探讨了在更新操作中如何处理缓存与数据库双写一致性问题,涉及先更新数据库再更新缓存和先更新缓存再更新数据库两种策略。当原子性被破坏时,可能出现的数据不一致情况以及相应的解决策略,如使用消息队列确保操作顺序,或者采用删除缓存时的排它读锁。此外,提到了监听binlog以保证数据一致性的方法。
摘要由CSDN通过智能技术生成

缓存与数据双写一致性问题

一般来说,执行更新操作时,我们会有两种选择:

  • 先操作数据库,再操作缓存
  • 先操作缓存,再操作数据库

两个操作要么同时成功,要么同时失败。所以,这会演变成一个分布式事务的问题。

如果原子性被破坏,会有两种情况:

  • 操作数据库成功,操作缓存失败
  • 操作缓存成功,操作数据库失败

如果第一步已经失败了,我们直接返回Exception出去就好了,第二步根本不会执行。

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

正常情况:

  • 先操作数据库,成功
  • 在操作缓存,成功

如果原子性被破坏了:

  • 第一步操作数据库成功,第二步操作缓存失败,会导致数据库中的数据是最新的,缓存中的数据是旧数据。
  • 如果第一步操作数据库就失败了,可以直接返回错误(Exception),不会出现数据不一致。

删除缓存失败的解决策略:

  • 将要删除的key放到消息队列中
  • 自己去消费,消费失败就重试直至消费成功

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

正常情况:

  • 删除缓存成功
  • 更新数据库成功

如果原子性被破坏:

  • 第一步删除缓存成功,第二步更新数据库失败,这个没有问题,数据库中的数据和缓存中的还是一致的。
  • 第一步删除缓存失败的话,也是一样可以直接返回(Exception)错误,数据库中的数据和缓存中的还是一致的。

意外情况:

A删除缓存

B发现此时缓存没有,从数据库中读进来更新缓存

A更新了数据

此时缓存中的数据就是旧值了。

意外情况的解决策略:

  • 用消息队列,将操作都发送到消息队列中的同一个 partiion 中,保证消费消息的顺序性。
  • 在删除缓存时候,用排它读锁给这条数据锁住,等此线程更新完之后再解锁 (个人见解,因为考虑到意外情况嘛,出现的频率肯定不是很高,在这引入消息队列系统会变得很复杂)

其他保障数据一致的方案与资料

可以用 databus 或者阿里的 canal监听binlog 进行更新。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值