本篇內(nèi)容主要講解“怎么實(shí)現(xiàn)與緩存的同步”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么實(shí)現(xiàn)MySQL與Redis緩存的同步”吧!
一、方案1(UDF) 場景分析:
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)岐山,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
當(dāng)我們對MySQL數(shù)據(jù)庫進(jìn)行數(shù)據(jù)操作時,同時將相應(yīng)的數(shù)據(jù)同步到Redis中,同步到Redis之后,查詢的操作就從Redis中查找這種方案適合于讀多寫少,并且不存并發(fā)寫的場景因?yàn)镸ySQL觸發(fā)器本身就會造成效率的降低,如果一個表經(jīng)常被操作,這種方案顯示是不合適的,歡迎關(guān)注:武哥聊編程 演示案例
下面是MySQL的表
二、方案2(解析binlog)
在介紹方案2之前我們先來介紹一下MySQL復(fù)制的原理,如下圖所示:主操作數(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ù)庫中
方案2就是:上面MySQL的整個復(fù)制流程可以總結(jié)為一句話,那就是:從服務(wù)器讀取主服務(wù)器Bin log中的數(shù)據(jù),從而同步到自己的數(shù)據(jù)庫中我們方案2也是如此,就是在概念上把主服務(wù)器改為MySQL,把從服務(wù)器改為Redis而已(如下圖所示),當(dāng)MySQL中有數(shù)據(jù)寫入時,我們就解析MySQL的Bin log,然后將解析出來的數(shù)據(jù)寫入到Redis中,從而達(dá)到同步的效果
云數(shù)據(jù)庫與本地數(shù)據(jù)庫是主從關(guān)系。云數(shù)據(jù)庫作為主數(shù)據(jù)庫主要提供寫,本地數(shù)據(jù)庫作為從數(shù)據(jù)庫從主數(shù)據(jù)庫中讀取數(shù)據(jù)本地數(shù)據(jù)庫讀取到數(shù)據(jù)之后,解析Bin log,然后將數(shù)據(jù)寫入寫入同步到Redis中,然后客戶端從Redis讀數(shù)據(jù) 這個技術(shù)方案的難點(diǎn)就在于:
Canal開源技術(shù)
canal是阿里巴巴旗下的一款開源項(xiàng)目,純Java開發(fā)?;跀?shù)據(jù)庫增量日志解析,提供增量數(shù)據(jù)訂閱&消費(fèi),目前主要支持了MySQL(也支持mariaDB)
開源參考地址有:https://github.com/liukelin/canal_mysql__sync工作原理(模仿MySQL復(fù)制):canal模擬mysql slave的交互協(xié)議,偽裝自己為mysql slave,向mysql master發(fā)送dump協(xié)議mysql master收到dump請求,開始推送binary log給slave(也就是canal)canal解析binary log對象(原始為byte流) 架構(gòu):
server代表一個canal運(yùn)行實(shí)例,對應(yīng)于一個jvm
instance對應(yīng)于一個數(shù)據(jù)隊(duì)列 (1個server對應(yīng)1..n個instance)
instance模塊:eventParser (數(shù)據(jù)源接入,模擬slave協(xié)議和master進(jìn)行交互,協(xié)議解析)eventSink (Parser和Store鏈接器,進(jìn)行數(shù)據(jù)過濾,加工,分發(fā)的工作)eventStore (數(shù)據(jù)存儲)metaManager (增量訂閱&消費(fèi)信息管理器)
parse解析MySQL的Bin log,然后將數(shù)據(jù)放入到sink中sink對數(shù)據(jù)進(jìn)行過濾,加工,分發(fā)store從sink中讀取解析好的數(shù)據(jù)存儲起來然后自己用設(shè)計代碼將store中的數(shù)據(jù)同步寫入Redis中就可以了其中parse/sink是框架封裝好的,我們做的是store的數(shù)據(jù)讀取那一步
下面是運(yùn)行拓?fù)鋱D
下面是具體化的zvsync中要用到的類,每當(dāng)新增或者刪除表時,直接進(jìn)行增刪就可以了