Redis与MySQL双写一致性如何保证?

1.操作数据库时,是删除缓存呢,还是更新缓存?

删除缓存。看下面这样一个例子:

  • 线程A先发起一个写操作,第一步先更新数据库
  • 线程B再发起一个写操作,第二步更新了数据库
  • 由于网络等原因,线程B先更新了缓存
  • 线程A更新缓存。

这时候,缓存保存的是A的数据(老数据),数据库保存的是B的数据(新数据),数据不一致了,脏数据出现啦。如果是删除缓存取代更新缓存则不会出现这个脏数据问题。

更新缓存相对于删除缓存,还有两点劣势:

  • 如果你写入的缓存值,是经过复杂计算才得到的话。更新缓存频率高的话,就浪费性能啦。
  • 在写数据库场景多,读数据场景少的情况下,数据很多时候还没被读取到,又被更新了,这也浪费了性能呢(实际上,写多的场景,用缓存也不是很划算了)

2.为什么要先更新数据库,再删除缓存?

  • 线程A发起一个写操作,第一步del cache
  • 此时线程B发起一个读操作,cache miss
  • 线程B继续读DB,读出来一个老数据
  • 然后线程B把老数据设置入cache
  • 线程A写入DB最新的数据

酱紫就有问题啦,缓存和数据库的数据不一致了。缓存保存的是老数据,数据库保存的是新数据

3.如果删除失败了怎么办?

使用消息队列

参考文献:

1.https://juejin.cn/post/6964531365643550751 

2.https://segmentfault.com/a/1190000039078249 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值