Redis与MySQL数据双写一致性

1. 什么是Redis与MySQL数据双写一致性

在这里插入图片描述

2. 同步直写与异步缓写

在这里插入图片描述

3. 数据库和缓存一致性的几种更新策略★

不允许:先更新缓存,再更新数据库这种策略

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

一般不用
先更新数据库,再更新缓存,如果Redis出现异常,会出现缓存读到脏数据的问题

1 先更新mysql的某商品的库存,当前商品的库存是100,更新为99个。
2 先更新mysql修改为99成功,然后更新redis。
3 此时假设异常出现,更新redis失败了,这导致mysql里面的库存是99而redis里面的还是100 。
4上述发生,会让数据库里面和缓存redis里面数据不一致,读到脏数据

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

低并发,小厂
如果数据库更新失败,导致B线程请求再次访问缓存时,发现redis里面没数据,缓存缺失,再去读取mysql时,从数据库中读取到旧值

低并发:把旧数据写会缓存
高并发:缓存击穿
流程:
(1)请求A进行写操作,删除缓存后,工作正在进行中…A还么有彻底更新完
(2)请求B开工,查询redis发现缓存不存在
(3)请求B继续,去数据库查询得到了myslq中的旧值
(4)请求B将旧值写入redis缓存
(5)请求A将新值写入mysql数据库
上述情况就会导致不一致的情形出现。

解决延时双删策略
在这里插入图片描述

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

假如缓存删除失败或者来不及,导致请求再次访问redis时缓存命中,读取到的是缓存旧值
企业常用
解决方案:
在这里插入图片描述

1 可以把要删除的缓存值或者是要更新的数据库值暂存到消息队列中(例如使用Kafka/RabbitMQ等)。
2 当程序没有能够成功地删除缓存值或者是更新数据库值时,可以从消息队列中重新读取这些值,然后再次进行删除或更新。
3 如果能够成功地删除或更新,我们就要把这些值从消息队列中去除,以免重复操作,此时,我们也可以保证数据库和缓存的数据一致了,否则还需要再次进行重试
4 如果重试超过的一定次数后还是没有成功,我们就需要向业务层发送报错信息了,通知运维人员。

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值