MySQL 与 Redis 缓存的同步方案,建议收藏!

基于redis 实现我的收藏功能优化详细设计方案 我的收藏功能优化详细设计方案 阅读详情

更多内容关注微信公众号:fullstack888

本文介绍MySQL与Redis缓存的同步的两种方案

  • 方案1:通过MySQL自动同步刷新Redis,MySQL触发器+UDF函数实现

  • 方案2:解析MySQL的binlog实现,将数据库中的数据同步到Redis


一、方案1(UDF)

  • 场景分析: 当我们对MySQL数据库进行数据操作时,同时将相应的数据同步到Redis中,同步到Redis之后,查询的操作就从Redis中查找

  • 过程大致如下:

    • 在MySQL中对要操作的数据设置触发器Trigger,监听操作

    • 客户端(NodeServer)向MySQL中写入数据时,触发器会被触发,触发之后调用MySQL的UDF函数

    • UDF函数可以把数据写入到Redis中,从而达到同步的效果

8171e3f94bc2754a03af8cf6d1358c63.png

  • 方案分析:

    • 这种方案适合于读多写少,并且不存并发写的场景

    • 因为MySQL触发器本身就会造成效率的降低,如果一个表经常被操作,这种方案显示是不合适的

演示案例

  • 下面是MySQL的表

2bc04fe7064ee1bfeeee42cb3d1e4f8e.png

  • 下面是UDF的解析代码

ee713382d61fc2ae915ae50b79e580d0.png

  • 定义对应的触发器

269dc67d78df18a92bb27a90a58bf60a.png

47c18233ad210114bfdcc8035f3ce022.png

ff3d4a37ad7b7752ee9cfc6ab342edef.png

二、方案2(解析binlog)

  • 在介绍方案2之前我们先来介绍一下MySQL复制的原理,如下图所示:

    • 主服务器操作数据,并将数据写入Bin log

    • 从服务器调用I/O线程读取主服务器的Bin log,并且写入到自己的Relay log中,再调用SQL线程从Relay log中解析数据,从而同步到自己的数据库中

db958b3035c0730a3d39cece6de30a75.png

  • 方案2就是:

    • 上面MySQL的整个复制流程可以总结为一句话,那就是:从服务器读取主服务器Bin log中的数据,从而同步到自己的数据库中

    • 我们方案2也是如此,就是在概念上把主服务器改为MySQL,把从服务器改为Redis而已(如下图所示),当MySQL中有数据写入时,我们就解析MySQL的Bin log,然后将解析出来的数据写入到Redis中,从而达到同步的效果

dc08fa0dd59765ef2b69ded492346d23.png

  • 例如下面是一个云数据库实例分析:

    • 云数据库与本地数据库是主从关系。云数据库作为主数据库主要提供写,本地数据库作为从数据库从主数据库中读取数据

    • 本地数据库读取到数据之后,解析Bin log,然后将数据写入写入同步到Redis中,然后客户端从Redis读数据

1dc7a7e35ff00faf2449d35554563c23.png

  • 这个技术方案的难点就在于: 如何解析MySQL的Bin Log。但是这需要对binlog文件以及MySQL有非常深入的理解,同时由于binlog存在Statement/Row/Mixedlevel多种形式,分析binlog实现同步的工作量是非常大的

Canal开源技术

  • canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)

  • 开源参考地址有:https://github.com/liukelin/canal_mysql_nosql_sync

  • 工作原理(模仿MySQL复制):

    • canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议

    • mysql master收到dump请求,开始推送binary log给slave(也就是canal)

    • canal解析binary log对象(原始为byte流)

6d360aab718843db82af1d560b076a92.png

  • 架构:

    • eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)

    • eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)

    • eventStore (数据存储)

    • metaManager (增量订阅&消费信息管理器)

    • server代表一个canal运行实例,对应于一个jvm

    • instance对应于一个数据队列 (1个server对应1..n个instance)

    • instance模块:

bdab39c2ee51f7ab29a0d9cebdb8718d.png

  • 大致的解析过程如下:

    • parse解析MySQL的Bin log,然后将数据放入到sink中

    • sink对数据进行过滤,加工,分发

    • store从sink中读取解析好的数据存储起来

    • 然后自己用设计代码将store中的数据同步写入Redis中就可以了

    • 其中parse/sink是框架封装好的,我们做的是store的数据读取那一步

503858cde264dcb331bdf9381aa20a64.png

  • 更多关于Cancl可以百度搜索

  • 下面是运行拓扑图

70401e8f374994cac514bcd3fea5978b.png

  • MySQL表的同步,采用责任链模式,每张表对应一个Filter。 例如zvsync中要用到的类设计如下:

f636aa1a55870db7cbdd5e89b375a985.png

  • 下面是具体化的zvsync中要用到的类, 每当新增或者删除表时,直接进行增删就可以了

74e03177c1509c064a8b5f48afb9f1c6.png

三、附加

本文上面所介绍的都是从MySQL中同步到缓存中。但是在实际开发中可能有人会用下面的方案:客户端有数据来了之后,先将其保存到Redis中,然后再同步到MySQL中 这种方案本身也是不安全/不可靠的,因此如果Redis存在短暂的宕机或失效,那么会丢失数据

a24f7a6c40877a9e6ce4d32c37f78d5f.png

- END -

往期回顾

◆微服务架构科普及设计模式

◆微服务之间的最佳调用方式

◆多账号统一登陆,账号模块的系统设计

◆美团技术 Leader,送给程序员的10条精进建议

◆基于 Prometheus、InfluxDB 与 Grafana 打造监控平台

◆Linux 操作系统 — I/O系统原理

◆爬虫或恶意攻击,如何动态屏蔽IP地址?

◆纯干货:系统架构性能问题诊断及优化思路

◆代码整洁 vs 代码肮脏

◆一个复杂系统的拆分改造实践!

259f7c8104071acaaae37c6df545dc2f.png

详情架构群的同学,加微信: jiagou6688 ,备注:Java

Rockchip RK3566 Buildroot SDK构建与内核编译实战指南 嵌入式Linux开发中,交叉编译环境是系统启动的基础支撑。Buildroot作为轻量级嵌入式构建框架,通过配置驱动、自动化下载和分层编译机制,显著降低定制化Linux发行版的集成门槛。其核心价值在于将内核、根文件系统与工具链统一管理,兼顾资源约束下的确定性构建与工程可复现性。典型应用场景涵盖ARM64平台(如RK3566)的固件开发、IoT设备量产镜像生成及硬件Bring-up阶段的快速验证。本文围绕Buildroot SDK全流程实践,深入解析环境搭建、Repo源码同步、离线DL库预置及内核编译等关键环节 阅读详情

相关推荐

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3516

Redis作为缓存,mysql的数据如何与redis进行同步?

允许延时一致的业务,采用异步通知使用MQ中间中间件,更新数据之后,通知缓存删除利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存强一致性的,采用Redisson提供的读写锁共享锁:读锁readLock,加锁之后,其他线程可以共享读操作排他锁存强一致性的,采用Redisson提供的读写锁共享锁:读锁readLock,加锁之后,其他线程可以共享读操作排他锁独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作。

m0_65778338的博客 2720

AI驱动的研发流程:定义高度专业和系统化的规划基准

在人工智能(AI)浪潮席卷全球的今天,软件研发的范式正经历着一场深刻而迅速的变革。AI技术的渗透,从最初的辅助工具角色,正逐步演变为驱动整个研发流程的核心引擎。传统的研发流程和项目管理方法论,在面对AI带来的高效率、高智能以及高复杂性挑战时,显得力不从心。企业对快速交付高质量软件产品、有效控制风险、并保证全流程可追溯性的需求日益迫切。

形上得其象,形下合于数;阴阳自济,玄理自明。 2181

Redis与Mysql数据同步解决方案

Redis与Mysql数据同步解决方案 方案1(普通) 读:读redis,没有数据就读mysql,将MySQL数据保存到缓存中。 写:写mysql,同时让redis缓存失效(删除key,过期) 缺点:数据量巨大,更新频繁的数据写入无能为力。比如数量巨大,每个变跟状态又很频繁,这样很容易把数据库写挂。 方案2(binlog) 基于binlog使用mysql_udf_redis,将数据库中的数据...

zhou920786312的博客 1万+

PCL Super4PCS算法实现点云粗配准(版本一)【2025最新版】

Win11系统下实现[Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。

点云侠的博客 3378

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2463

Mysql和redis数据同步解决方案

mysql集群 1 主从复制 解决单机故障问题 2 高可用 对外提供一个主节点,投票选举机制. 3 cluster集群,多个主节点 怎么优化单个主节点的处理能力?从主从复制出发 主节点 master 写操作,数据变更,binlog记录。会有一个dump线程和从节点的I/O线程交互,dump将binglog中具体数据传给IO线程。 从节点,slave 开启I/O线程,从主节点读取binglog,将其写入 relay log (中继日志),再通过sql线程,读取relay log ,写入从库。

LJZFlying的博客 5508

Python爬虫实战:社交媒体热点事件追踪与情感分析可视化

本文探讨了如何利用Python爬虫技术从微博和Twitter等社交媒体平台抓取数据,进行热点事件追踪和情感分析,并通过可视化方式展示舆论情感变化。文章详细介绍了最新的爬虫技术、数据处理方法和可视化实现,提供了完整的代码示例,帮助读者构建自己的社交媒体分析系统。关键词:Python爬虫、社交媒体分析、情感分析、数据可视化、热点追踪爬虫框架:Requests-HTML、aiohttp、Twint(Twitter专用)数据处理文本处理:Jieba(中文分词)、NLTK(英文处理)情感分析。

2201_76125261的博客 1105

redis 和mysql 增量同步_Redis主从复制的全量和增量同步介绍

全量同步:1.slave服务器连接到master服务器,发送SYNC命令slave服务器通过 syncWithMaster() 函数来连接 Master 服务器(如果Master服务器需要密码登录的话,先登录),并且发送SYNC命令请求同步,接着打开 rdb 文件(用于存储由Master发送过来的数据),创建读rdb 的 IO 事件(readSyncBulkPayload)2.master服务器备...

weixin_34626779的博客 656

学Simulink——线控转向(Steer‑By‑Wire, SBW)路感模拟与回正控制仿真

本文详细介绍了线控转向(SBW)系统的Simulink建模方法,重点讲解了路感模拟与回正控制的实现原理。文章首先分析了SBW系统结构,建立了方向盘和前轮的动力学方程;随后分步骤演示了Simulink建模过程,包括方向盘二阶动力学、前轮位置闭环控制、路感反馈计算等核心模块;最后通过仿真验证了转向跟随性能、路感反馈效果和自动回正功能。文中还提供了工程实现的关键参数和注意事项,为开发真实的SBW系统提供了实用指导。该模型可扩展应用于主动转向、故障注入等高级功能开发。

xiaoheshang_123的博客 39

【AI智能体】Claude Code +Superpowers 项目实战操作详解

Claude Code +Superpowers 项目实战操作详解

congge 4050

Redis实现mysql的高速访问以及完成mysql与redis的数据同步

主机分布 172.25.33.1 httpd+php 172.25.33.2 redis 172.25.33.3 Mariadb 172.25.33.1安装httpd php php-mysql yum -y install httpd php php-mysql 获取测试文件test.php <?php $redis = new Redis(); $red...

zhangyu_sing的博客 3390

ABAP链接外围数据库SQL实战案例

这是一个ABAP 直接读取SQL数据库数据的实例,以此种方式可以将SAP与外围的系统做一些集成,比如生产,SAP本身生产这部分是弱项,管不了那么细,很多车间的数据都是在MES系统,如管理上需要则可以将MES的一些数据自动读取过来,结合SAP本身的业务数据,做一些分析是比较方便的。 1、首先在SAP里建立数据库链接:DBCO ,直接增加一条记录,填上数据库的相关信息:IP地址、数据库名、账号SA、密码这些。 2、开发程序,设置成自动运行的计划,固定时间自动读取SQL里的数据,保存到SAP自定义表.

heng0757的专栏 1511

Java基础到就业!项目加面试!之Redis面试大全!倾心整理【建议收藏】

Redis面试大全 前前后后,小孟已经帮助很多的小伙伴挺近了大厂。 我是农村出来的娃,从程序员到项目主管到产品经理,到现在公司出任CEO!技术改变了我的命运。 我身边越来越多的朋友,从农村出来到现在在大城市安身立命,甚至在一线城市买车买房。有的已经成为大厂的Leader,年薪200w+。 所以关注我,不迷路。小孟拥有极光的互联网关系,可以找我内推各个大厂。 极度的说明了,只要努力,一切皆有可能! 技术改变世界,知识改变命运! 鸡汤已经喝完了,让我开干! 前面已

程序员springmeng 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Redis知识点全面讲解,建议收藏

本文对Redis知识点全面讲解,其中包含企业解决方案等

m0_65450831的博客 1421

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis 缓存使用技巧和设计方案,建议收藏!

缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。下面来说说缓存的收益和成本分析、缓存更新策略的选择和使用场景、缓存粒度控制方法、穿透问题优化、无底洞问题优化、雪崩问题优化、热点key重建优化等相关问题。

dream317 1014

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

redis强一致_总结!数据库缓存最终一致性的四种方案

小Hub领读:缓存与数据库数据一致性问题,一直是面试官很喜欢问的问题,你知道有多少方案,每种的优缺点是啥?最终会采用哪种方案较好,你觉得呢?作者:叶不闻https://juejin.im/post/5d5c99b66fb9a06ae072060d背景缓存是软件开发中一个非常有用的概念,数据库缓存更是在项目中必然会遇到的场景。而缓存一致性的保证,更是在面试中被反复问到,这里进行一下总结,针...

weixin_39755003的博客 1616

整理了一些关于 Redis的高频面试题【建议收藏】

1、Redis和 MySQL 有啥区别? mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。 redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限 在类型上mysql是关系型数据库,而redis是缓存数据库;作用上mysql用于持久化的存储数据到硬盘,而redis用于存储使用较为频繁的数据到缓存中 2.mysql的运行机制 mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请.

胖太乙 7994

HoRain云--Redis缓存与MySQL数据一致性全攻略

《Redis缓存与数据库一致性策略解析》摘要(148字) 本文系统梳理了保障Redis与数据库一致性的五大核心策略:1)缓存更新三模式(旁路/直写/异步写回)及适用场景;2)高一致性方案(延迟双删、分布式锁);3)异步解耦方案(MQ、Binlog同步);4)失效监控机制(TTL设置、异常补偿)。通过对比表分析各策略在一致性强度、性能影响和复杂度上的差异,提出选型建议:读多写少场景推荐CacheAside+延迟双删组合,强一致性场景需采用WriteThrough+分布式锁。文末强调规避双写顺序错误等关键注意事

sinat_57153473的博客 1024

【建议收藏】Redis和Mysql如何保持数据一致性?

在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题所以,我们都会用Redis来做数据的缓存,削减对数据库的请求但是,Mysql和Redis是两种不同的数据库,如何保证不同数据...

独行侠梦的博客 534

Java基础到就业!项目加面试!之Redis面试大全!倾心整理【建议收藏】_redis结合项目面试

简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。最主要的Redis就是缓存应用!Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。

m0_61067876的博客 971

使用redis缓存用户行为(包括用户点赞收藏关注不喜欢)

文章摘要: 本文介绍了基于Redis和Kafka的用户行为数据存储与处理方案。系统采用Redis存储用户行为(点赞、收藏、阅读等),利用其高性能和丰富数据结构特性;通过Kafka实现异步持久化到MySQL,保证数据最终一致性。详细设计了Redis Key命名规范(如LIKE-BEHAVIOR-{articleId}),并给出了Java实现示例。方案包含双写策略、幂等处理、降级机制等优化点,适用于高并发场景下的用户行为处理,实现秒级响应和可靠存储的平衡。

qq_61723836的博客 864

微服务架构中常用的多级缓存设计,建议收藏!

今天我们来聊聊缓存这个话题,看看在微服务环境下如何设计有效的多级缓存架构。主要涉及三方面内容:Web 应用的客户端缓存;应用层静态资源缓存;服务层多级缓存。首先,咱们先讲解微服务架构的多级缓存设计。

Wewe的博客 1188

我把面试问烂了的⭐Redis面试题⭐总结了一下(带答案,万字总结,精心打磨,建议收藏)

我把面试问烂了的⭐Redis⭐面试题总结了一下(带答案,万字总结,精心打磨,建议收藏)

java程序鱼的博客 2万+

详解Redis缓存穿透、缓存雪崩、缓存击穿:Java程序员高并发必杀技![特殊字符](文末附解决方案对比表和实战代码,建议收藏!)

作为Java程序员,Redis是你简历上的必备技能,但你真的能搞定缓存穿透、雪崩、击穿这三大“高并发杀手”吗?本文不仅教你原理,更给出可直接抄作业的Java代码方案,让你轻松应对大厂级高并发场景!:每秒10万请求直接击穿Redis,MySQL被打挂!:数据库瞬间QPS飙升到10万+,直接宕机!:自动续期锁时间,避免死锁(默认30秒续期):百万请求同时查询数据库,服务器直接冒烟!:双11零点,所有商品缓存同时过期。:微博热搜突然爆炸,但缓存刚好过期。(调整k和m,平衡内存与误判率)的数据(数据库根本不存在)

TGQlovemm的博客 778
上一篇: 微服务架构科普及设计模式
下一篇: HTTP 的第一次变革 — HTTP/2
qianshanding0708
博客等级 码龄11年 426粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值