news 2026/7/7 5:41:08

Redis——redis和mysql的数据同步

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis——redis和mysql的数据同步

redis经常作为mysql的缓存,以提升用户访问速度、降低mysql服务的压力,但是这样就会涉及到mysql和redis数据同步问题:
我们得尽量保证,修改完数据库后,redis缓存也能同步成新的数据,否则,redis层一直用旧的数据拦截请求,更新会很长时间不起作用(除非缓存过期)

缓存延时双删

步骤核心使命如果没有它,会发生什么?
① 先删缓存制造“空窗期”,避免更新期间有人读到明确的旧缓存。更新过程中,读请求会一直命中旧缓存,造成短暂脏读。
② 更新数据库持久化新值,这是最终的事实标准。(无意义,这是必做项)
③ 延时等待并发读请求完成“旧数据回填”操作。在进行数据库更新之前,如果有一个查询请求提前查询到了数据库的旧数据,或者说因为隔离性等原因看到旧数据,就会把旧数据回填到redis缓存中,第二次如果删除执行太早(没有延时),“旧回填数据”就会发生在第二次删除之后,等于白删。
④ 再删缓存清除被并发读线程误回填的旧缓存,保证最终一致性。缓存中可能会永久残留旧数据(直到过期),导致长期不一致。

需要注意的是:

  • 缓存延时双删保证的是最终一致性,而不是实时一致性,总有一些时候缓存设Mysql数据库的内容不一致,我们能做的只是尽力缩短不一致的时间。
  • 另外,这个方法也可能失效,假设在进行数据库更新之前,一个查询请求提前查询到了数据库的旧数据,或者说因为隔离性等原因看到旧数据,等到延时时间过了之后才把旧数据回填到redis缓存中,这样redis中仍旧还会长期存放旧数据。
  • 延时可能降低缓存命中率降低性能,造成mysql服务压力增大。

缓存版本号

每一条数据多存储一个版本号,一条修改请求这样进行:

  • 首先直接修改mysql中的数据,并把版本号++
  • 然后修改redis缓存,对比当前数据库和redis缓存的版本号,如果大于,则更新,否则,说明更加新的修改已经先其一步回填,操作取消
  • 因为不会删除缓存,所以不会出现旧数据回填的情景

这种方法不需要延时等待,性能较高,但是实现较为复杂,而且仍旧会出现数据短暂不一致的的情况(不过相对于缓存延时双删它结果更加稳定,一般不会有失效问题)。


Binlog订阅(Canal+MQ)

一个标准的Canal+MQ方案的架构如下:

  1. 业务应用:只负责更新MySQL数据库,完全不操作Redis缓存。

  2. MySQL:数据变更时,将变更细节写入Binlog日志。

  3. Canal Server:伪装成从库,实时获取Binlog,解析后作为生产者将变更事件发送到MQ。

  4. 消息队列(MQ):作为消息的缓冲和分发中心,保证消息可靠投递。

  5. 缓存同步服务:作为消费者从MQ订阅消息,根据事件内容(如更新、删除)执行对应的Redis操作(更新或删除缓存)。

这种方法的问题在于缓存更新延时比较大数据不一致的情况比较久而且实现复杂,优点在于业务代码与缓存彻底解耦(业务代码只操作数据库),同时解决了缓存版本号的一个漏洞:如果两个更新是修改一条数据的不同部分,另一个修改可能因为版本号小(后更新数据库的范围先更新缓存)而更新不到缓存上。


redis执行失败

无论哪种同步方法,其实都害怕redis执行失败,一旦失败,由于数据库修改了缓存却修改失败,就会造成长时间的数据不一致问题。

所以一般来说每种方法都要搭配一个队列,队列里存放执行失败的redis语句,设置一个线程来反复执行之前失败的语句,直到执行成功。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 5:38:00

AI绘画工具文化细节测试:以白无垢和服生成为例

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚这个测试到底在验证什么 看到“舞萌ai测试”这个标题,很多人第一反应可能是舞蹈动作生成或者角色换装。但从“…

作者头像 李华
网站建设 2026/7/7 5:34:57

GRAIL:基于3D资产与视频先验的人形机器人运动-操作生成框架

1. 项目概述:这不是又一个“机器人跳舞”Demo,而是一套真正打通3D世界理解与物理动作执行的生成闭环GRAIL——这个名字听起来像某种神秘古籍,但放在人形机器人领域,它代表的是当前少有的、把“看懂视频”“理解3D空间”“生成可执…

作者头像 李华
网站建设 2026/7/7 5:33:40

Thingsboard - 用户密码设置

本文介绍三种情况下的密码设置:新建用户时、忘记密码时、自己变更密码时。 1. 新建用户时 该方式适合管理员新建用户后,为其直接设置密码。 1.1 新建用户 如果是管理员直接为用户建立账号,激活方式选择显示激活链接,这样可以直接为…

作者头像 李华
网站建设 2026/7/7 5:31:02

F28377D Modbus RTU跨平台移植:三组关键映射实战指南

1. 项目概述:为什么“跨平台移植Modbus”这件事,值得花半小时认真对待Modbus协议本身不挑平台——它只认功能码、寄存器地址、CRC校验和字节序。但真正让工程师头皮发紧的,从来不是协议本身,而是把一套在STM32上跑得稳如老狗的Mod…

作者头像 李华
网站建设 2026/7/7 5:28:12

0基础搞定RAG原理

0基础搞定RAG原理:从"人工智障"到"企业级智能助手"2022 年底,ChatGPT 的横空出世,打破了传统搜索引擎一统天下的格局,也正式拉开了大模型 AI 时代的序幕。大模型凭借强大的推理和生成能力,迅速进入…

作者头像 李华
网站建设 2026/7/7 5:27:01

为什么说Notepad--是你跨平台文本编辑的最佳选择?

为什么说Notepad--是你跨平台文本编辑的最佳选择? 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 你是否曾…

作者头像 李华