Mysql和Redis如何保证数据一致性


前言

如何保证数据库和缓存双写一致,下面提供几种方法,来讨论下他们的优缺点。


一、先更新数据库,再更新redis

这种方案,应该没人采用。
如果先更新数据库成功,接着更新redis失败,那么会造成数据不一致,所以这种方法舍弃

二、先更新redis,在更新数据库

这种方案和第一种相似,也具有相同的问题
如果更新reids成功,更新数据库失败,那么同样会造成数据不一致

三 先更新数据库,再删除redis

这种方案,同样会造成数据不一致的问题,但是相比上两个方案,如果他设置key的过期时间,那么保证了数据的最终一致性。如果在更新数据库后删除redis失败,又未设置redis过期时间。那么会造成数据不一致。

如果线程A更新数据库,正准备更新redis时。线程B在更新线程A更新redis前获取了redis中的数据,那么其他数据拿到的数据还是旧数据,如果删除redis失败也会造成数据不一致

解决方案:
1.mysql和redis设置事务,在发生异常时回滚数据
2.redis设置重试机制,在删除失败后进入重试模式

四 先删除redis,再更新数据库

这种方案,同样存在一定几率的不一致现象,但是已经接近最优了。

如果线程A删除了redis,正准备更新数据库。线程B查询了redis没有之后,查询了数据库的旧数据,并且把它写到redis。之后线程A才更新数据成功,会出现数据库和redis的数据不一致

解决方案:延迟双删

线程A在删除redis以及更新数据库后,睡眠一段时间后,再次删除reids中的数据。这个睡眠时间得大于一次查询的时间。


总结

数据一致性没有绝对的保证,要么牺牲性能加锁,要么串行。在高并发下,这些方案都只能做到优化

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值