淺談MySQL與redis緩存的同步方案
本文介紹MySQL與Redis緩存的同步的兩種方案
- 方案1:通過(guò)MySQL自動(dòng)同步刷新Redis,MySQL觸發(fā)器+UDF函數(shù)實(shí)現(xiàn)
- 方案2:解析MySQL的binlog實(shí)現(xiàn),將數(shù)據(jù)庫(kù)中的數(shù)據(jù)同步到Redis
一、方案1(UDF)
場(chǎng)景分析:當(dāng)我們對(duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作時(shí),同時(shí)將相應(yīng)的數(shù)據(jù)同步到Redis中,同步到Redis之后,查詢的操作就從Redis中查找
過(guò)程大致如下:
在MySQL中對(duì)要操作的數(shù)據(jù)設(shè)置觸發(fā)器Trigger,監(jiān)聽(tīng)操作
客戶端(NodeServer)向MySQL中寫入數(shù)據(jù)時(shí),觸發(fā)器會(huì)被觸發(fā),觸發(fā)之后調(diào)用MySQL的UDF函數(shù)
UDF函數(shù)可以把數(shù)據(jù)寫入到Redis中,從而達(dá)到同步的效果
方案分析:
- 這種方案適合于讀多寫少,并且不存并發(fā)寫的場(chǎng)景
- 因?yàn)镸ySQL觸發(fā)器本身就會(huì)造成效率的降低,如果一個(gè)表經(jīng)常被操作,這種方案顯示是不合適的
演示案例
下面是MySQL的表
下面是UDF的解析代碼
定義對(duì)應(yīng)的觸發(fā)器
二、方案2(解析binlog)
在介紹方案2之前我們先來(lái)介紹一下MySQL復(fù)制的原理,如下圖所示:
- 主服務(wù)器操作數(shù)據(jù),并將數(shù)據(jù)寫入Bin log
- 從服務(wù)器調(diào)用I/O線程讀取主服務(wù)器的Bin log,并且寫入到自己的Relay log中,再調(diào)用SQL線程從Relay log中解析數(shù)據(jù),從而同步到自己的數(shù)據(jù)庫(kù)中
方案2就是:
- 上面MySQL的整個(gè)復(fù)制流程可以總結(jié)為一句話,那就是:從服務(wù)器讀取主服務(wù)器Bin log中的數(shù)據(jù),從而同步到自己的數(shù)據(jù)庫(kù)中
- 我們方案2也是如此,就是在概念上把主服務(wù)器改為MySQL,把從服務(wù)器改為Redis而已(如下圖所示),當(dāng)MySQL中有數(shù)據(jù)寫入時(shí),我們就解析MySQL的Bin log,然后將解析出來(lái)的數(shù)據(jù)寫入到Redis中,從而達(dá)到同步的效果
例如下面是一個(gè)云數(shù)據(jù)庫(kù)實(shí)例分析:
云數(shù)據(jù)庫(kù)與本地?cái)?shù)據(jù)庫(kù)是主從關(guān)系。云數(shù)據(jù)庫(kù)作為主數(shù)據(jù)庫(kù)主要提供寫,本地?cái)?shù)據(jù)庫(kù)作為從數(shù)據(jù)庫(kù)從主數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)
本地?cái)?shù)據(jù)庫(kù)讀取到數(shù)據(jù)之后,解析Bin log,然后將數(shù)據(jù)寫入寫入同步到Redis中,然后客戶端從Redis讀數(shù)據(jù)
這個(gè)技術(shù)方案的難點(diǎn)就在于:如何解析MySQL的Bin Log。但是這需要對(duì)binlog文件以及MySQL有非常深入的理解,同時(shí)由于binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實(shí)現(xiàn)同步的工作量是非常大的
Canal開(kāi)源技術(shù)
canal是阿里巴巴旗下的一款開(kāi)源項(xiàng)目,純Java開(kāi)發(fā)?;跀?shù)據(jù)庫(kù)增量日志解析,提供增量數(shù)據(jù)訂閱&消費(fèi),目前主要支持了MySQL(也支持mariaDB)
開(kāi)源參考地址有:https://github.com/liukelin/canal_mysql_nosql_sync
工作原理(模仿MySQL復(fù)制):
- canal模擬mysql slave的交互協(xié)議,偽裝自己為mysql slave,向mysql master發(fā)送dump協(xié)議
- mysql master收到dump請(qǐng)求,開(kāi)始推送binary log給slave(也就是canal)
- canal解析binary log對(duì)象(原始為byte流)
架構(gòu):
server代表一個(gè)canal運(yùn)行實(shí)例,對(duì)應(yīng)于一個(gè)jvm
instance對(duì)應(yīng)于一個(gè)數(shù)據(jù)隊(duì)列 (1個(gè)server對(duì)應(yīng)1..n個(gè)instance)
instance模塊:
- eventParser (數(shù)據(jù)源接入,模擬slave協(xié)議和master進(jìn)行交互,協(xié)議解析)
- eventSink (Parser和Store鏈接器,進(jìn)行數(shù)據(jù)過(guò)濾,加工,分發(fā)的工作)
- eventStore (數(shù)據(jù)存儲(chǔ))
- metaManager (增量訂閱&消費(fèi)信息管理器)
大致的解析過(guò)程如下:
- parse解析MySQL的Bin log,然后將數(shù)據(jù)放入到sink中
- sink對(duì)數(shù)據(jù)進(jìn)行過(guò)濾,加工,分發(fā)
- store從sink中讀取解析好的數(shù)據(jù)存儲(chǔ)起來(lái)
- 然后自己用設(shè)計(jì)代碼將store中的數(shù)據(jù)同步寫入Redis中就可以了
- 其中parse/sink是框架封裝好的,我們做的是store的數(shù)據(jù)讀取那一步
更多關(guān)于Cancl可以百度搜索
下面是運(yùn)行拓?fù)鋱D
MySQL表的同步,采用責(zé)任鏈模式,每張表對(duì)應(yīng)一個(gè)Filter。例如zvsync中要用到的類設(shè)計(jì)如下:
下面是具體化的zvsync中要用到的類,每當(dāng)新增或者刪除表時(shí),直接進(jìn)行增刪就可以了
三、附加
本文上面所介紹的都是從MySQL中同步到緩存中。但是在實(shí)際開(kāi)發(fā)中可能有人會(huì)用下面的方案:
- 客戶端有數(shù)據(jù)來(lái)了之后,先將其保存到Redis中,然后再同步到MySQL中
- 這種方案本身也是不安全/不可靠的,因此如果Redis存在短暫的宕機(jī)或失效,那么會(huì)丟失數(shù)據(jù)
到此這篇關(guān)于淺談MySQL與redis緩存的同步方案的文章就介紹到這了,更多相關(guān)MySQL與redis緩存同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入學(xué)習(xí)MySQL表數(shù)據(jù)操作
這篇文章主要介紹了深入學(xué)習(xí)MySQL表數(shù)據(jù)操作,基于表操作內(nèi)容圍繞主題展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08mysql如何將表結(jié)構(gòu)導(dǎo)出到excel
這篇文章主要介紹了mysql如何將表結(jié)構(gòu)導(dǎo)出到excel,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-09-09MySQL中ON DUPLICATE KEY UPDATE語(yǔ)句的使用
INSERT INTO ... ON DUPLICATE KEY UPDATE?是一個(gè)強(qiáng)大的SQL語(yǔ)句,它結(jié)合了插入新記錄和更新已存在記錄的功能于一體,本文就來(lái)介紹一下MySQL中ON DUPLICATE KEY UPDATE語(yǔ)句的使用,感興趣的可以了解一下2024-08-08MySQL 5.7.29 + Win64 解壓版 安裝教程圖文詳解
這篇文章主要介紹了MySQL 5.7.29 + Win64 解壓版 安裝教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05關(guān)于MySql鏈接url參數(shù)的設(shè)置
最近整理了一下網(wǎng)上關(guān)于MySql 鏈接url 參數(shù)的設(shè)置以及常用的幾個(gè)較為重要的參數(shù),大家若感興趣可以參考下2014-03-03MySQL復(fù)制出錯(cuò) Last_SQL_Errno:1146的解決方法
這篇文章主要介紹了MySQL復(fù)制出錯(cuò) Last_SQL_Errno:1146的解決方法,需要的朋友可以參考下2016-07-07Windows下Mysql啟動(dòng)報(bào)1067的解決方法
這篇文章主要為大家詳細(xì)介紹了Windows下Mysql啟動(dòng)報(bào)1067的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10