婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談MySQL與redis緩存的同步方案

淺談MySQL與redis緩存的同步方案

熱門標簽:百應電話機器人優勢 啥是企業400電話辦理 曲靖移動外呼系統公司 電話外呼系統改號 怎樣在地圖標注銷售區域 外呼系統打電話上限是多少 地圖標注費用是多少 武漢網絡外呼系統服務商 南昌三維地圖標注

本文介紹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)

開源參考地址有: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流)

架構:

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

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

instance模塊:

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

大致的解析過程如下:

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

更多關于Cancl可以百度搜索

下面是運行拓撲圖

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

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

三、附加

本文上面所介紹的都是從MySQL中同步到緩存中。但是在實際開發中可能有人會用下面的方案:

  • 客戶端有數據來了之后,先將其保存到Redis中,然后再同步到MySQL中
  • 這種方案本身也是不安全/不可靠的,因此如果Redis存在短暫的宕機或失效,那么會丟失數據

到此這篇關于淺談MySQL與redis緩存的同步方案的文章就介紹到這了,更多相關MySQL與redis緩存同步內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Java手動實現Redis的LRU緩存機制
  • 淺談redis緩存在項目中的使用
  • 詳解redis緩存與數據庫一致性問題解決
  • 手動實現Redis的LRU緩存機制示例詳解
  • 使用 Redis 緩存實現點贊和取消點贊的示例代碼
  • 詳解Redis 緩存刪除機制(源碼解析)
  • Redis 緩存實現存儲和讀取歷史搜索關鍵字的操作方法
  • SpringCache 分布式緩存的實現方法(規避redis解鎖的問題)
  • 詳解緩存穿透擊穿雪崩解決方案

標簽:黑河 滄州 吉林 隨州 錦州 甘南 荊州 資陽

巨人網絡通訊聲明:本文標題《淺談MySQL與redis緩存的同步方案》,本文關鍵詞  淺談,MySQL,與,redis,緩存,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談MySQL與redis緩存的同步方案》相關的同類信息!
  • 本頁收集關于淺談MySQL與redis緩存的同步方案的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 怀远县| 邓州市| 仁布县| 馆陶县| 德钦县| 申扎县| 南漳县| 阳信县| 霍邱县| 景洪市| 皮山县| 江孜县| 太和县| 南靖县| 定南县| 丽水市| 贵溪市| 东莞市| 嘉鱼县| 中江县| 老河口市| 开封市| 东乌珠穆沁旗| 米泉市| 长泰县| 耒阳市| 明水县| 博乐市| 湖口县| 襄垣县| 兰溪市| 老河口市| 东光县| 盈江县| 大田县| 三河市| 项城市| 澜沧| 庄河市| 昌吉市| 拜泉县|