MySQL 与 Redis 缓存的同步方案

点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

日英文

You must be strong now. You must never give up. And when you are afraid of the dark, don't forget the light is always there. 

你要坚强,决不能放弃。当你担忧生活黑暗无边之时,请记得希望总会在某处闪光。

每日掏心话

每个人的一生都注定要跋涉坎坎,品尝那些苦涩与无奈。

责编:乐乐 | 来自:江南、董少链接:dongshao.blog.csdn.net/article/details/107190925

编程技术圈(ID:study_tech)第 1202 次推文

往日回顾:一文全面解析 Postman 工具

     

   正文   

本文介绍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中,从而达到同步的效果一步一图,带你走进 Netty 的世界!
方案分析:这种方案适合于读多写少,并且不存并发写的场景因为MySQL触发器本身就会造成效率的降低,如果一个表经常被操作,这种方案显示是不合适的演示案例下面是MySQL的表下面是UDF的解析代码谁动了我的主机?活用history命令
定义对应的触发器二、方案2(解析binlog)在介绍方案2之前我们先来介绍一下MySQL复制的原理,如下图所示:主服务器操作数据,并将数据写入Bin log从服务器调用I/O线程读取主服务器的Bin log,并且写入到自己的Relay log中,再调用SQL线程从Relay log中解析数据,从而同步到自己的数据库中携手阿里云送一波超大福利!不仅有低价ECS,更有机械键盘、AirPods Pro等好礼!
方案2就是:上面MySQL的整个复制流程可以总结为一句话,那就是:从服务器读取主服务器Bin log中的数据,从而同步到自己的数据库中我们方案2也是如此,就是在概念上把主服务器改为MySQL,把从服务器改为Redis而已(如下图所示),当MySQL中有数据写入时,我们就解析MySQL的Bin log,然后将解析出来的数据写入到Redis中,从而达到同步的效果例如下面是一个云数据库实例分析:云数据库与本地数据库是主从关系。云数据库作为主数据库主要提供写,本地数据库作为从数据库从主数据库中读取数据本地数据库读取到数据之后,解析Bin log,然后将数据写入写入同步到Redis中,然后客户端从Redis读数据这个技术方案的难点就在于: 如何解析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流)万字长文:助你攻破 JAVA NIO 技术壁垒
架构:eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)eventStore (数据存储)metaManager (增量订阅&消费信息管理器)server代表一个canal运行实例,对应于一个jvminstance对应于一个数据队列 (1个server对应1..n个instance)instance模块:大致的解析过程如下:parse解析MySQL的Bin log,然后将数据放入到sink中sink对数据进行过滤,加工,分发store从sink中读取解析好的数据存储起来然后自己用设计代码将store中的数据同步写入Redis中就可以了其中parse/sink是框架封装好的,我们做的是store的数据读取那一步更多关于Cancl可以百度搜索下面是运行拓扑图奇奇怪怪的大佬:理发店小弟到阿里P10
MySQL表的同步,采用责任链模式,每张表对应一个Filter。 例如zvsync中要用到的类设计如下:下面是具体化的zvsync中要用到的类, 每当新增或者删除表时,直接进行增删就可以了三、附加本文上面所介绍的都是从MySQL中同步到缓存中。但是在实际开发中可能有人会用下面的方案:客户端有数据来了之后,先将其保存到Redis中,然后再同步到MySQL中 这种方案本身也是不安全/不可靠的,因此如果Redis存在短暂的宕机或失效,那么会丢失数据PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
欢迎加入后端架构师交流群,在后台回复“学习”即可。
在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结别找了,想获取史上最简单的Java大厂面试题学习资料扫下方二维码回复「面试」就好了猜你还想看阿里、腾讯、百度、华为、京东最新面试题汇集一次 HTTP 请求到底经历了什么?
总结一下,我在国企当程序员!
腾讯员工晒出薪资:真实985毕业薪资,大家看我还有救吗?网友:日薪?
嘿,你在看吗?