美文网首页
如何保证redis与mysql数据最终一致性

如何保证redis与mysql数据最终一致性

作者: 修行者12138 | 来源:发表于2022-01-26 12:43 被阅读0次

大前提

  1. 如果要求强一致性,就不要使用redis,使用redis代表可以接受最终一致性
  2. 使用redis作为缓存,必须设置过期时间,原因: 即使程序有问题,不能保证redis的最终一致性,key也会自己失效

保证redis与mysql数据最终一致性,有以下几种方案

方案一

先更新redis,再更新mysql
流程图


image.png

最后mysql是请求1的数据,redis是请求2的数据,不能保证最终一致性

方案二

先更新mysql,再更新redis
流程图


image.png

最后mysql是请求2的数据,redis是请求1的数据,不能保证最终一致性

方案三

先删redis,再更新mysql
流程图


image.png

最后mysql是新数据,redis是旧数据,不能保证最终一致性

方案四

先更新mysql,再删redis
流程图


image.png

最后mysql是新数据,redis是旧数据

方案五

延迟删除: 先更新mysql,然后sleep一段时间,再删除redis
流程图


image.png

sleep时间,由业务侧决定,最好是大于查询接口的耗时。

方案六

方案五的问题是: 更新mysql后,删除redis之前,查询请求从redis查到的是旧数据,虽然可以保证最终一致性,但是查到旧数据的时间较长。

基于方案五的问题,方案六提出了延迟双删: 先删redis,然后更新mysql,然后sleep一段时间,再删除redis。
本方案可以让用户更早查询到新数据。

image.png

方案六看起来是所有方案中最优的,但其实还是有问题,比如下面的情况(出现概率极低),如果确实发生了这种情况,只能等key到达过期时间自己失效,或者引入mq等中间件对删除redis失败做重试。


image.png

最后,友情提示一下,这个问题是面试高频题,但是面试没法画图,很难描述清楚各种场景,可以用下面的表达方式

请求1: 更新redis--------------------------------------更新mysql
请求2: -------------更新redis--------------更新mysql
最后redis是请求2的数据,mysql是请求1的数据

相关文章

网友评论

      本文标题:如何保证redis与mysql数据最终一致性

      本文链接:https://www.haomeiwen.com/subject/mfpohrtx.html