Redis与MySQL数据双写一致性

Redis与MySQL数据双写一致性

  • 1. 什么是Redis与MySQL数据双写一致性
  • 2. 同步直写与异步缓写
  • 3. 数据库和缓存一致性的几种更新策略★
    • 1)先更新数据库,再更新缓存
    • 2)先删除缓存,再更新数据库
    • 3)先更新数据库,再删除缓存
    • 总结

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

在这里插入图片描述

2. 同步直写与异步缓写

Redis与MySQL数据双写一致性_第1张图片

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数据库
上述情况就会导致不一致的情形出现。

解决延时双删策略
Redis与MySQL数据双写一致性_第2张图片

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

假如缓存删除失败或者来不及,导致请求再次访问redis时缓存命中,读取到的是缓存旧值
企业常用
解决方案:
Redis与MySQL数据双写一致性_第3张图片

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

总结

Redis与MySQL数据双写一致性_第4张图片

你可能感兴趣的:(Redis,redis,mysql,缓存)