当前位置: 首页 > article >正文

Redis和MySQL的实时数据同步方案

针对 Redis 和 MySQL 的实时数据同步,需根据业务场景选择不同的技术方案,核心目标是保障数据一致性、降低延迟、提升系统可靠性。以下是几种典型方案及其适用场景:


方案一:基于 MySQL Binlog 的异步同步

原理
  1. 监听 MySQL 的 Binlog 日志(记录所有数据变更事件)。
  2. 解析 Binlog(如通过 Canal、Debezium 等工具)。
  3. 将变更事件推送到 Redis(更新或删除对应缓存)。
架构流程
MySQL → Binlog → 中间件(Canal) → 消息队列(Kafka) → Redis消费者 → 更新Redis
优势
  • 对应用透明:无需修改业务代码。
  • 高可靠性:Binlog 是 MySQL 原生日志,确保数据变更不丢失。
  • 支持复杂变更:可捕获 UPDATE、DELETE、INSERT 等操作。
缺点
  • 延迟稍高:异步处理通常有毫秒到秒级延迟。
  • 部署复杂度高:需维护中间件和消息队列。
适用场景
  • 缓存一致性要求高:如电商商品详情、库存同步。
  • 写操作频繁:需实时更新缓存的场景。
实现示例
// Canal客户端监听Binlog(伪代码)
CanalConnector connector = CanalConnectors.newClusterConnector("127.0.0.1:2181", "example", "", "");
connector.connect();
connector.subscribe(".*\\..*");
while (true) {Message message = connector.getWithoutAck(100);for (CanalEntry.Entry entry : message.getEntries()) {if (entry.getEntryType() == CanalEntry.EntryType.ROWDATA) {CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());for (CanalEntry.RowData rowData : rowChange.getRowDatasList()) {String tableName = entry.getHeader().getTableName();String key = "cache:" + tableName + ":" + rowData.getBeforeColumns(0).getValue();if (rowChange.getEventType() == CanalEntry.EventType.DELETE) {redis.del(key);  // 删除缓存} else {redis.set(key, serialize(rowData.getAfterColumnsList()));  // 更新缓存}}}}
}

方案二:应用层双写(强一致性)

原理

在业务代码中同步写入 MySQL 和 Redis,通过事务保证原子性。

架构流程
应用层 → 开启事务 → 写入MySQL → 写入Redis → 提交事务
优势
  • 强一致性:Redis 与 MySQL 数据完全同步。
  • 低延迟:同步写入,无异步链路。
缺点
  • 性能损耗:双写增加请求耗时。
  • 事务复杂性:需处理分布式事务(如 Redis 写入失败时的回滚)。
适用场景
  • 写操作低频但强一致:如账户余额、支付状态。
  • 简单系统:无复杂中间件维护能力的小型项目。
实现示例
// 伪代码:双写(需结合事务管理器)
@Transactional
public void updateUser(User user) {// 先写MySQLuserMapper.update(user);// 再写RedisString key = "user:" + user.getId();redisTemplate.opsForValue().set(key, user);// 若Redis写入失败,MySQL事务会回滚
}

方案三:消息队列解耦(最终一致性)

原理
  1. 应用层写入 MySQL 后,发送消息到消息队列(如 Kafka、RocketMQ)。
  2. 消费者异步消费消息,更新 Redis。
架构流程
应用层 → 写MySQL → 发消息到MQ → 消费者 → 更新Redis
优势
  • 解耦:业务层与缓存更新逻辑分离。
  • 削峰填谷:MQ 缓冲流量,避免 Redis 压力过大。
缺点
  • 最终一致性:存在秒级延迟。
  • 消息堆积风险:需监控消费者处理速度。
适用场景
  • 高并发写入:如社交平台动态发布后的缓存预热。
  • 允许短暂不一致:如文章阅读量统计。
实现示例
// 伪代码:写入MySQL后发消息
public void createOrder(Order order) {orderMapper.insert(order);  // 写MySQLkafkaTemplate.send("order-topic", order.getId());  // 发送消息
}// 消费者更新Redis
@KafkaListener(topics = "order-topic")
public void listen(String orderId) {Order order = orderMapper.selectById(orderId);  // 查最新数据redisTemplate.opsForValue().set("order:" + orderId, order);
}

方案四:延迟双删(应对缓存穿透)

原理
  1. 先删除 Redis 缓存
  2. 更新 MySQL
  3. 延迟一定时间后再次删除 Redis(处理并发脏读)。
架构流程
应用层 → 删除Redis → 写MySQL → 延迟 → 再删Redis
优势
  • 简单有效:减少缓存与数据库不一致时间窗口。
缺点
  • 无法完全避免不一致:极端并发下仍有脏数据可能。
  • 依赖延迟时间设置:需根据业务调整。
适用场景
  • 读多写少:如配置信息更新。
  • 对一致性要求不苛刻:允许短暂旧数据存在。
实现示例
// 伪代码:延迟双删
public void updateConfig(Config config) {String key = "config:" + config.getId();redisTemplate.delete(key);        // 第一次删除configMapper.update(config);     // 写MySQL// 延迟1秒后再删一次(异步执行)scheduledExecutor.schedule(() -> redisTemplate.delete(key), 1, TimeUnit.SECONDS);
}

方案五:结合数据库触发器(慎用)

原理
  1. 在 MySQL 中设置触发器(Trigger),监听数据变更。
  2. 触发器调用外部程序(如 UDF 或 HTTP API)更新 Redis。
缺点
  • 性能影响大:触发器会增加数据库负载。
  • 维护困难:需编写存储过程或外部接口。
适用场景
  • 遗留系统改造:无法修改应用代码时的临时方案。

方案选型对比

方案一致性延迟性能影响复杂度适用场景
Binlog 异步同步最终一致毫秒~秒级高频写、要求最终一致
应用层双写强一致毫秒级低频写、强一致(如支付)
消息队列解耦最终一致秒级高并发写、允许延迟
延迟双删最终一致秒级读多写少、简单系统
数据库触发器强一致毫秒级遗留系统改造(不推荐)

关键注意事项

  1. 缓存失效策略
    • 主动更新(推荐):通过同步机制更新。
    • 被动淘汰:设置合理 TTL,防止长期脏数据。
  2. 数据回环问题
    • 避免同步操作再次触发写 MySQL(如 Binlog 同步到 Redis 后,不应反向写回 MySQL)。
  3. 监控与告警
    • 监控 Redis 与 MySQL 的数据差异(如定时对比关键表)。
    • 监控同步延迟(如 Kafka 消费 Lag)。
  4. 降级方案
    • 同步失败时,可降级为直接读 MySQL,并记录日志告警。

总结

  • 优先推荐 Binlog + 消息队列方案:适合多数高并发场景,平衡一致性与性能。
  • 强一致性场景选择双写+事务:需结合分布式事务框架(如 Seata)。
  • 简单场景用延迟双删:快速实现,但需容忍短暂不一致。
  • 避免过度设计:根据实际业务需求选择最简单有效的方案。

相关文章:

Redis和MySQL的实时数据同步方案

针对 Redis 和 MySQL 的实时数据同步,需根据业务场景选择不同的技术方案,核心目标是保障数据一致性、降低延迟、提升系统可靠性。以下是几种典型方案及其适用场景: 方案一:基于 MySQL Binlog 的异步同步 原理 监听 MySQL 的 Bin…...

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons,微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次,在微软实施删除后现在已安装这些扩展的开发者也会…...

JavaScript 进阶A(作用域、闭包、变量和函数提升、函数相关只是、数组解构、对象解构、构造函数

1.作用域 作用域主要分为:局部作用域和全局作用域。 局部作用域又分为:函数作用域和块作用域 函数作用域:在函数中定义的变量只能在函数内部使用,外部无法访问块作用域:被大括号{}包起来的代码块,在这个…...

mybatis映射文件相关的知识点总结

mybatis映射文件相关的知识点总结 mybatis官网地址 英文版:https://mybatis.org/mybatis-3/index.html 中文版:https://mybatis.p2hp.com/ 搭建环境 /* SQLyog Ultimate v10.00 Beta1 MySQL - 8.0.30 : Database - mybatis-label *****************…...

【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记

本文介绍了优先队列与堆,分析了最小堆的插入与删除过程,并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型,其元素按照优先级顺序被处理。不同于普通队列的先进先出(FIFO)&…...

【JAVA】ThreadPoolTaskExecutor 线程池学习、后端异步、高并发处理

ThreadPoolTaskExecutor 是 Spring 框架提供的一个线程池实现类,基于 Java 原生的 ThreadPoolExecutor 进行了封装和扩展,支持更灵活的配置,并与 Spring 的依赖注入、生命周期管理等功能无缝集成。它常用于异步任务处理、定时任务调度和高并发…...

C#:LINQ学习笔记01:LINQ基础概念

一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法。强类型检查:编译时类型安全,减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...

爬虫系列之发送请求与响应《一》

一、请求组成 1.1 请求方式:GET和POST请求 GET:从服务器获取,请求参数直接附在URL之后,便于查看和分享,常用于获取数据和查询操作 POST:用于向服务器提交数据,其参数不会显示在URL中,而是包含在…...

【零基础到精通Java合集】第十集:List集合框架

课程标题:List集合框架(15分钟) 目标:掌握List接口核心实现类(ArrayList/LinkedList)的使用与场景选择,熟练操作有序集合 0-1分钟:List概念引入 以“购物清单”类比List特性:元素有序(添加顺序)、可重复、支持索引访问。说明List是Java集合框架中最常用的数据结构…...

小米手机如何录制屏幕?手机、电脑屏幕录制方法分享

大家最近有没有遇到想记录手机屏幕操作的情况? 比如精彩的游戏瞬间、有趣的视频教程,或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手,今天就来给你好好唠唠,小米手机如何录制屏幕,以及后续如何处理这…...

【RTC】 TM32 RTC(实时时钟)库函数 配置

1. 硬件配置 与HAL库相同,需确保以下硬件条件: 外部低速晶振(LSE,32.768kHz)连接至 OSC32_IN 和 OSC32_OUT 引脚。 备用电池(VBAT)已连接,确保断电时RTC持续运行。 2. 标准外设库(库函数)配置步骤 2.1 初始化RTC时钟源 #include "stm32f10x.h" #include…...

策略模式的C++实现示例

核心思想 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端,从而使得客户端可以根据需要动态切换算法,而不需要修改…...

deepseek、腾讯元宝deepseek R1、百度deepseekR1关系

分析与结论 区别与联系 技术基础与定制方向: DeepSeek官网R1版本:作为基础版本,通常保留通用性设计,适用于广泛的AI应用场景(如自然语言处理、数据分析等)。其优势在于技术原生性和官方直接支持。腾讯元宝…...

Leetcode 面试150题(三)

一、题目 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &am…...

3D Web轻量化引擎HOOPS Communicator的核心优势解析:高性能可视化与灵活部署!

在当今数字化时代,工业领域的工程应用不断向基于Web的方向发展,而HOOPS Web平台作为一款专为构建此类工程应用程序打造的软件开发套件集,正发挥着日益重要的作用,成为构建强大工程应用的基石。 一、HOOPS Web平台概述 HOOPS Web…...

python爬虫:python中使用多进程、多线程和协程对比和采集实践

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 多进程爬虫1.1 python多进程样例1.2 实现多进程爬虫2. 多线程爬虫2.1 python多线程样例2.2 实现多线程爬虫3. 协程爬虫3.1 python协程样例3.2 实现协程爬虫在网络爬虫中,为了提高抓取效率,常常需要使用多进程、多线…...

从 JVM 源码(HotSpot)看 synchronized 原理

大家好,我是此林。 不知道大家有没有这样一种感觉,网上对于一些 Java 框架和类的原理实现众说纷纭,看了总是不明白、不透彻。常常会想:真的是这样吗? 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…...

深入探索Python机器学习算法:模型调优

深入探索Python机器学习算法:模型调优 文章目录 深入探索Python机器学习算法:模型调优模型调优1. 超参数搜索方法1.1 网格搜索(Grid Search)1.2 随机搜索(Random Search)1.3 贝叶斯优化(Bayesia…...

windows 上删除 node_modules

在 Windows 11 上,你可以通过命令行来删除 node_modules 文件夹并清除 npm 缓存。以下是具体步骤: 删除 node_modules 打开命令提示符(Command Prompt)或终端(PowerShell)。 导航到项目目录。你可以使用 …...

postman请求后端接受List集合对象

后端集合 post请求,即前端请求方式...

Kimi“撞车”DeepSeek!新一代注意力机制的极限突破!

近期,各方大佬在注意力机制上又“打起来了”。首先登场的是顶流DeepSeek,新论文梁文锋署名,提出了一种新的注意力机制NSA。同天,Kimi杨植麟署名的新注意力架构MoBA开源。紧接着,华为诺亚提出高效选择注意力架构ESA。 …...

如何在Android中实现服务(Service)

在Android中,Service 是一种用于在后台执行长时间运行操作而不提供用户界面的组件。Service 可以执行各种后台任务,如下载文件、播放音乐、执行定时任务等。以下是如何在Android中实现Service的基本步骤: 1. 创建一个Service类 首先&#x…...

计算机网络---SYN Blood(洪泛攻击)

文章目录 三次握手过程SYN Flood攻击原理防御措施协议层优化网络层拦截系统配置调整 TCP协议是 TCP/IP 协议栈中一个重要的协议,平时我们使用的浏览器,APP等大多使用 TCP 协议通讯的,可见 TCP 协议在网络中扮演的角色是多么的重要。 TCP 协议…...

Ollama存在安全风险的情况通报及解决方案

据清华大学网络空间测绘联合研究中心分析,开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛,多数用户使用Ollama私有化部署且未修改默认配置,存在数据泄露、算力盗…...

视频流畅播放相关因素

视频播放的流畅度是一个综合性问题,涉及从视频文件本身到硬件性能、网络环境、软件优化等多个环节。以下是影响流畅度的关键因素及优化建议: 一、视频文件本身 1. 分辨率与帧率 1.问题:高分辨率(如4K)或高帧率&#…...

蓝桥杯试题:二分查找

一、问题描述 给定 n 个数形成的一个序列 a,现定义如果一个连续子序列包含序列 a 中所有不同元素,则该连续子序列便为蓝桥序列,现在问你,该蓝桥序列长度最短为多少? 例如 1 2 2 2 3 2 2 1,包含 3 个不同的…...

机器人训练环境isaac gym以及legged_gym项目的配置问题

完整的安装环境教程(强烈推荐):...

Qt QOCI driver available but not loaded(可用但未加载)

参考Linux Qt 6安装Oracle QOCI SQL Driver插件(适用WSL),根据SQL Database Drivers成功将libqsqloci.so、qsqloci.debug等文件安装到/opt/Qt6.8.2/6.8.2/gcc_64/plugins/sqldrivers后,运行Qt程序并尝试连接数据库时仍然报错 QSql…...

健康医疗大数据——医疗影像

一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域,通过实训培养团队成员对医疗大数据处理和分析的实际…...

学生管理信息系统的需求分析与设计

伴随教育的迅猛演进以及学生规模的不断扩增,学生管理信息系统已然成为学校管理的关键利器。此系统能够助力学校管控学生的课程成绩、考勤记载、个人资讯等诸多数据,提升学校的管理效能与服务品质。 一.需求分析 1.1 学生信息管理 学生信息在学校管理体…...