怎么實(shí)現(xiàn)MySQL與Redis緩存的同步

本篇內(nèi)容主要講解“怎么實(shí)現(xiàn)MySQL與redis緩存的同步”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么實(shí)現(xiàn)MySQL與Redis緩存的同步”吧!

成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站10余年經(jīng)驗(yàn)成就非凡,專(zhuān)業(yè)從事成都做網(wǎng)站、成都網(wǎng)站建設(shè),成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)頁(yè)制作,軟文發(fā)布平臺(tái)廣告投放平臺(tái)等。10余年來(lái)已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:18982081108,我們期待您的來(lái)電!

 

一、方案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中寫(xiě)入數(shù)據(jù)時(shí),觸發(fā)器會(huì)被觸發(fā),觸發(fā)之后調(diào)用MySQL的UDF函數(shù)
  • UDF函數(shù)可以把數(shù)據(jù)寫(xiě)入到Redis中,從而達(dá)到同步的效果

怎么實(shí)現(xiàn)MySQL與Redis緩存的同步

 
方案分析:
  • 這種方案適合于讀多寫(xiě)少,并且不存并發(fā)寫(xiě)的場(chǎng)景
  • 因?yàn)镸ySQL觸發(fā)器本身就會(huì)造成效率的降低,如果一個(gè)表經(jīng)常被操作,這種方案顯示是不合適的,歡迎關(guān)注:武哥聊編程
 

演示案例

下面是MySQL的表

怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

下面是UDF的解析代碼

怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

定義對(duì)應(yīng)的觸發(fā)器

怎么實(shí)現(xiàn)MySQL與Redis緩存的同步    

二、方案2(解析binlog)

在介紹方案2之前我們先來(lái)介紹一下MySQL復(fù)制的原理,如下圖所示:怎么實(shí)現(xiàn)MySQL與Redis緩存的同步

  • 服務(wù)器操作數(shù)據(jù),并將數(shù)據(jù)寫(xiě)入Bin log
  • 從服務(wù)器調(diào)用I/O線程讀取主服務(wù)器的Bin log,并且寫(xiě)入到自己的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ù)寫(xiě)入時(shí),我們就解析MySQL的Bin log,然后將解析出來(lái)的數(shù)據(jù)寫(xiě)入到Redis中,從而達(dá)到同步的效果
怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

例如下面是一個(gè)云數(shù)據(jù)庫(kù)實(shí)例分析:

  • 云數(shù)據(jù)庫(kù)與本地?cái)?shù)據(jù)庫(kù)是主從關(guān)系。云數(shù)據(jù)庫(kù)作為主數(shù)據(jù)庫(kù)主要提供寫(xiě),本地?cái)?shù)據(jù)庫(kù)作為從數(shù)據(jù)庫(kù)從主數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)
  • 本地?cái)?shù)據(jù)庫(kù)讀取到數(shù)據(jù)之后,解析Bin log,然后將數(shù)據(jù)寫(xiě)入寫(xiě)入同步到Redis中,然后客戶端從Redis讀數(shù)據(jù)
怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

這個(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流)
怎么實(shí)現(xiàn)MySQL與Redis緩存的同步    
架構(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)信息管理器)
怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

大致的解析過(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ù)同步寫(xiě)入Redis中就可以了
  • 其中parse/sink是框架封裝好的,我們做的是store的數(shù)據(jù)讀取那一步
怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

更多關(guān)于Cancl可以百度搜索

 
下面是運(yùn)行拓?fù)鋱D
怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

MySQL表的同步,采用責(zé)任鏈模式,每張表對(duì)應(yīng)一個(gè)Filter。例如zvsync中要用到的類(lèi)設(shè)計(jì)如下:

怎么實(shí)現(xiàn)MySQL與Redis緩存的同步  

下面是具體化的zvsync中要用到的類(lèi),每當(dāng)新增或者刪除表時(shí),直接進(jìn)行增刪就可以了

怎么實(shí)現(xiàn)MySQL與Redis緩存的同步    

到此,相信大家對(duì)“怎么實(shí)現(xiàn)MySQL與Redis緩存的同步”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站標(biāo)題:怎么實(shí)現(xiàn)MySQL與Redis緩存的同步
轉(zhuǎn)載來(lái)源:http://muchs.cn/article28/jchojp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、定制開(kāi)發(fā)電子商務(wù)、網(wǎng)站內(nèi)鏈、軟件開(kāi)發(fā)商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站