中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么實現MySQL與Redis緩存的同步

發布時間:2021-08-13 19:26:30 來源:億速云 閱讀:176 作者:chen 欄目:云計算

本篇內容主要講解“怎么實現MySQLRedis緩存的同步”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么實現MySQL與Redis緩存的同步”吧!


 

一、方案1(UDF)

 
場景分析:

當我們對MySQL數據庫進行數據操作時,同時將相應的數據同步到Redis中,同步到Redis之后,查詢的操作就從Redis中查找

 
過程大致如下:
  • 在MySQL中對要操作的數據設置觸發器Trigger,監聽操作
  • 客戶端(NodeServer)向MySQL中寫入數據時,觸發器會被觸發,觸發之后調用MySQL的UDF函數
  • UDF函數可以把數據寫入到Redis中,從而達到同步的效果

怎么實現MySQL與Redis緩存的同步

 
方案分析:
  • 這種方案適合于讀多寫少,并且不存并發寫的場景
  • 因為MySQL觸發器本身就會造成效率的降低,如果一個表經常被操作,這種方案顯示是不合適的,歡迎關注:武哥聊編程
 

演示案例

下面是MySQL的表

怎么實現MySQL與Redis緩存的同步  

下面是UDF的解析代碼

怎么實現MySQL與Redis緩存的同步  

定義對應的觸發器

怎么實現MySQL與Redis緩存的同步    

二、方案2(解析binlog)

在介紹方案2之前我們先來介紹一下MySQL復制的原理,如下圖所示:怎么實現MySQL與Redis緩存的同步

  • 服務器操作數據,并將數據寫入Bin log
  • 從服務器調用I/O線程讀取主服務器的Bin log,并且寫入到自己的Relay log中,再調用SQL線程從Relay log中解析數據,從而同步到自己的數據庫中

方案2就是:

  • 上面MySQL的整個復制流程可以總結為一句話,那就是:從服務器讀取主服務器Bin log中的數據,從而同步到自己的數據庫中
  • 我們方案2也是如此,就是在概念上把主服務器改為MySQL,把從服務器改為Redis而已(如下圖所示),當MySQL中有數據寫入時,我們就解析MySQL的Bin log,然后將解析出來的數據寫入到Redis中,從而達到同步的效果
怎么實現MySQL與Redis緩存的同步  

例如下面是一個云數據庫實例分析:

  • 云數據庫與本地數據庫是主從關系。云數據庫作為主數據庫主要提供寫,本地數據庫作為從數據庫從主數據庫中讀取數據
  • 本地數據庫讀取到數據之后,解析Bin log,然后將數據寫入寫入同步到Redis中,然后客戶端從Redis讀數據
怎么實現MySQL與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流)
怎么實現MySQL與Redis緩存的同步    
架構:

server代表一個canal運行實例,對應于一個jvm

instance對應于一個數據隊列 (1個server對應1..n個instance)

instance模塊:

  • eventParser (數據源接入,模擬slave協議和master進行交互,協議解析)
  • eventSink (Parser和Store鏈接器,進行數據過濾,加工,分發的工作)
  • eventStore (數據存儲)
  • metaManager (增量訂閱&消費信息管理器)
怎么實現MySQL與Redis緩存的同步  

大致的解析過程如下:

  • parse解析MySQL的Bin log,然后將數據放入到sink中
  • sink對數據進行過濾,加工,分發
  • store從sink中讀取解析好的數據存儲起來
  • 然后自己用設計代碼將store中的數據同步寫入Redis中就可以了
  • 其中parse/sink是框架封裝好的,我們做的是store的數據讀取那一步
怎么實現MySQL與Redis緩存的同步  

更多關于Cancl可以百度搜索

 
下面是運行拓撲圖
怎么實現MySQL與Redis緩存的同步  

MySQL表的同步,采用責任鏈模式,每張表對應一個Filter。例如zvsync中要用到的類設計如下:

怎么實現MySQL與Redis緩存的同步  

下面是具體化的zvsync中要用到的類,每當新增或者刪除表時,直接進行增刪就可以了

怎么實現MySQL與Redis緩存的同步    

到此,相信大家對“怎么實現MySQL與Redis緩存的同步”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云林县| 龙海市| 龙井市| 长垣县| 华亭县| 日土县| 台北市| 登封市| 滨海县| 印江| 景泰县| 岳阳市| 运城市| 郁南县| 长春市| 商洛市| 琼海市| 仪陇县| 珠海市| 凭祥市| 茌平县| 仲巴县| 元朗区| 澳门| 浠水县| 兴山县| 益阳市| 漳州市| 额尔古纳市| 安平县| 靖远县| 周至县| 许昌市| 文水县| 区。| 滕州市| 尼勒克县| 钟山县| 扎囊县| 娄烦县| 仙桃市|