<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL與Redis緩存的同步方案

          共 2370字,需瀏覽 5分鐘

           ·

          2021-07-04 09:05

          作者:董少、

          鏈接:https://dongshao.blog.csdn.net/article/details/107190925

          本文介紹MySQL與Redis緩存的同步的兩種方案

          • 通過MySQL自動同步刷新Redis,MySQL觸發(fā)器+UDF函數實現
          • 解析MySQL的binlog實現,將數據庫中的數據同步到Redis

          一、方案1(UDF)

          場景分析:

          當我們對MySQL數據庫進行數據操作時,同時將相應的數據同步到Redis中,同步到Redis之后,查詢的操作就從Redis中查找

          過程大致如下:

          • 在MySQL中對要操作的數據設置觸發(fā)器Trigger,監(jiān)聽操作
          • 客戶端(NodeServer)向MySQL中寫入數據時,觸發(fā)器會被觸發(fā),觸發(fā)之后調用MySQL的UDF函數
          • UDF函數可以把數據寫入到Redis中,從而達到同步的效果

          方案分析:

          • 這種方案適合于讀多寫少,并且不存并發(fā)寫的場景
          • 因為MySQL觸發(fā)器本身就會造成效率的降低,如果一個表經常被操作,這種方案顯示是不合適的

          演示案例

          下面是MySQL的表

          下面是UDF的解析代碼

          定義對應的觸發(fā)器

          二、方案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開發(fā)。基于數據庫增量日志解析,提供增量數據訂閱&消費,目前主要支持了MySQL(也支持mariaDB)

          開源參考地址有:https://github.com/liukelin/canal_mysql_nosql_sync

          工作原理(模仿MySQL復制):

          • canal模擬mysql slave的交互協(xié)議,偽裝自己為mysql slave,向mysql master發(fā)送dump協(xié)議
          • mysql master收到dump請求,開始推送binary log給slave(也就是canal)
          • canal解析binary log對象(原始為byte流)

          架構:

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

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

          instance模塊:

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

          大致的解析過程如下:

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

          更多關于Cancl可以百度搜索

          下面是運行拓撲圖

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

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

          三、附加

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

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


          大家覺得有所幫助希望可以動動手指點贊、分享、收藏、留言呀。


          —————END—————

          推薦閱讀:

          Spring Boot 集成 Swagger-Bootstrap-UI
          IDEA下創(chuàng)建SpringBoot項目實現動態(tài)登錄與注冊功能
          老大懟我好幾次,不要隨便提 “分庫分表”
          23 種設計模式的通俗解釋,雖然有點污,但是秒懂

          最近面試BAT,整理一份面試資料Java面試BAT通關手冊,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數據庫、數據結構等等。
          獲取方式:關注公眾號并回復 java 領取,更多內容陸續(xù)奉上。
          明天見(??ω??)??
          瀏覽 52
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  看操逼网 | 西西4444www无码大胆 | 伊人成人影片 | 国内视频一区 | 大香蕉性视频 |