page contents

MySQL与Redis缓存的同步方案

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

attachments-2021-03-ooGTJP6a6042ee39654c9.png

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

  • 通过MySQL自动同步刷新Redis,MySQL触发器+UDF函数实现
  • 解析MySQL的binlog实现,将数据库中的数据同步到Redis


一、方案1(UDF)

场景分析:

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

过程大致如下:

  • 在MySQL中对要操作的数据设置触发器Trigger,监听操作
  • 客户端(NodeServer)向MySQL中写入数据时,触发器会被触发,触发之后调用MySQL的UDF函数
  • UDF函数可以把数据写入到Redis中,从而达到同步的效果

attachments-2021-03-p0bIO2oM6042ee7e7f8ae.jpg

方案分析:

  • 这种方案适合于读多写少,并且不存并发写的场景
  • 因为MySQL触发器本身就会造成效率的降低,如果一个表经常被操作,这种方案显示是不合适的

演示案例

下面是MySQL的表

attachments-2021-03-8jhcwayI6042ee873384b.png

下面是UDF的解析代码

attachments-2021-03-PfQQxEEt6042ee8f61252.jpg

定义对应的触发器

attachments-2021-03-dggdQLGQ6042ee988da6e.jpg

attachments-2021-03-17dWASQZ6042ee9e007ef.jpgattachments-2021-03-vfAE22eV6042eea424b93.jpg


二、方案2(解析binlog)

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

attachments-2021-03-pSNHaSkP6042eeb8415a4.jpg

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

方案2就是:

  • 上面MySQL的整个复制流程可以总结为一句话,那就是:从服务器读取主服务器Bin log中的数据,从而同步到自己的数据库中
  • 我们方案2也是如此,就是在概念上把主服务器改为MySQL,把从服务器改为Redis而已(如下图所示),当MySQL中有数据写入时,我们就解析MySQL的Bin log,然后将解析出来的数据写入到Redis中,从而达到同步的效果

attachments-2021-03-B4BYson36042eec135640.png

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

  • 云数据库与本地数据库是主从关系。云数据库作为主数据库主要提供写,本地数据库作为从数据库从主数据库中读取数据
  • 本地数据库读取到数据之后,解析Bin log,然后将数据写入写入同步到Redis中,然后客户端从Redis读数据

attachments-2021-03-UB5jfloe6042eedae6ba2.png

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


二、附加

本文上面所介绍的都是从MySQL中同步到缓存中。但是在实际开发中可能有人会用下面的方案:

  • 客户端有数据来了之后,先将其保存到Redis中,然后再同步到MySQL中
  • 这种方案本身也是不安全/不可靠的,因此如果Redis存在短暂的宕机或失效,那么会丢失数据

attachments-2021-03-mfhE3R2T6042ee7151d83.jpg


attachments-2021-03-U1a6Gldd6042ee5c8bb4a.jpg来源:https://dongshao.blog.csdn.net/article/details/107190925

  • 发表于 2021-03-06 10:51
  • 阅读 ( 759 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章