《MySQL 與 Redis 緩存的同步方案,建議收藏!》 全棧技術資源社區本文介紹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中,從而達到同步的效果 方案分析:這種方案適合於讀多寫少,並且不存並發寫的場景因為MySQL觸發器本身就會造成效率的降低,如果一個表經常被操作,這種方案顯示是不合適的演示案例下面是MySQL的表 下面是UDF的解析代碼 定義對應的觸發器 二、方案2(解析binlog)在介紹方案2之前我們先來介紹一下MySQL複制的原理,如下圖所示:主服務器操作數據,並將數據寫入Bin log從服務器調用I/O線程讀取主服務器的Bin log,並且寫入到自己的Relay log中,再調用SQL線程從Relay log中解析數據,從而同步到自己的數據庫中 方案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) 工作原理(模仿MySQL複制):canal模擬mysql slave的交互協議,偽裝自己為mysql slave,向mysql master發送dump協議mysql master收到dump請求,開始推送binary log給slave(也就是canal)canal解析binary log對象(原始為byte流) 架構: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可以百度搜索下面是運行拓撲圖 MySQL表的同步,采用責任鏈模式,每張表對應一個Filter。 例如zvsync中要用到的類設計如下: 下面是具體化的zvsync中要用到的類, 每當新增或者刪除表時,直接進行增刪就可以了 三、附加本文上面所介紹的都是從MySQL中同步到緩存中。但是在實際開發中可能有人會用下面的方案:客戶端有數據來了之後,先將其保存到Redis中,然後再同步到MySQL中 這種方案本身也是不安全/不可靠的,因此如果Redis存在短暫的宕機或失效,那麼會丟失數據 《MySQL 與 Redis 緩存的同步方案,建議收藏!》完,請繼續朗讀精采文章。 喜歡 小編的世界 e4to.com,請記得按讚、收藏及分享!
音調
速度
音量
語言
MySQL 與 Redis 緩存的同步方案,建議收藏!
精確朗讀模式適合大多數瀏覽器,也相容於桌上型與行動裝置。
不過,使用Chorme瀏覽器仍存在一些問題,不建議使用Chorme瀏覽器進行精確朗讀。