精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

新選擇!基于Spring Boot監聽MySQL日志Binlog實現數據實時同步

數據庫 MySQL
MySQL與Redis數據實時同步的主要目的是優化性能和保持數據一致性。通過將熱點數據存儲在Redis中,可以大大提高系統的訪問速度,同時確保MySQL中的數據變化能夠實時反映到Redis中,避免數據不一致的問題。

1. 簡介

MySQL與Redis數據實時同步是將MySQL數據庫中的數據變化實時地反映到Redis緩存系統中的過程。MySQL是一款穩定的關系型數據庫,適合做持久化存儲;而Redis是一個高性能的內存數據庫,適合做緩存和實時數據處理。將兩者結合使用,可以充分發揮各自的優勢,提升系統性能和穩定性。

實現MySQL與Redis數據實時同步有多種方法,如使用MySQL的二進制日志(Binlog)配合Canal或Debezium等工具。此外,還可以在應用層進行雙寫操作或使用消息隊列實現數據同步。

MySQL與Redis數據實時同步的主要目的是優化性能和保持數據一致性。通過將熱點數據存儲在Redis中,可以大大提高系統的訪問速度,同時確保MySQL中的數據變化能夠實時反映到Redis中,避免數據不一致的問題。這種同步機制在電商、社交等需要高并發訪問和實時數據更新的場景中尤為重要。

本篇文章我將介紹另外一款非常不錯開源的組件mysql-binlog-connector-java。通過名稱就能知道他是通過連接MySQL binlog日志來實現數據監聽的。該組件不僅僅是能夠實時監聽binlog的變化,而且你還可以直接去讀取binlog日志文件解析其內容。

該組件具備以下特性:

  • 自動解析二進制日志文件名/位置 | GTID 解析
  • 斷開連接可恢復
  • 插件化的故障轉移策略
  • 支持 binlog_checksum=CRC32(適用于 MySQL 5.6.2+ 用戶)
  • 通過 TLS 進行安全通信
  • 友好的Java管理擴展(JMX)
  • 實時統計
  • 在 Maven Central 上可用
  • 無第三方依賴,跨不同版本的 MySQL 發行版的測試套件

接下來,我將通過如下幾方面介紹該組件在項目中的使用:

  • 編程解析binlog日志
  • 實時監聽binlog日志
  • 通過JMX暴露binlog客戶端 

2. 實戰案例

環境準備

<dependency>
  <groupId>com.zendesk</groupId>
  <artifactId>mysql-binlog-connector-java</artifactId>
  <version>0.30.1</version>
</dependency>


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

當前mysql-binlog-connector-java最新版本為0.30.1。你可以通過下面地址查看倉庫版本情況:

https://mvnrepository.com/artifact/com.zendesk/mysql-binlog-connector-java

注意:你的確定你開啟了binlog日志

SHOW VARIABLES LIKE '%log_bin%'

圖片圖片

通過上面的命令查看狀態。

2.1 編程讀取binlog日志

public static void main(String[] args) throws Exception {


  File binlogFile = new File("C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Data\\mysql-bin.000032") ;
  EventDeserializer eventDeserializer = new EventDeserializer() ;
  // 設置兼容性模式
  eventDeserializer.setCompatibilityMode(
    EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
    EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY);
  BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
  try {
    for (Event event; (event = reader.readEvent()) != null;) {
      EventData data = event.getData() ;
      // 判斷事件的類型
      if (data instanceof WriteRowsEventData ed) {
        List<Serializable[]> rows = ed.getRows() ;
        rows.forEach(row -> {
          for (Serializable s : row) {
            if (s instanceof byte[] bs) {
              System.err.print(new String(bs) + "\t") ;
            } else {
              System.err.print(s + "\t") ;
            }
          }
          System.out.println() ;
        });
      } else if (data instanceof QueryEventData ed) {
        System.out.printf("查詢事件:%s%n", ed.getSql()) ;
      } else if (data instanceof DeleteRowsEventData ed) {
        System.err.println("刪除事件") ;
      } else if (data instanceof TableMapEventData ed) {
        String database = ed.getDatabase() ;
        String table = ed.getTable() ;
        System.out.printf("數據庫: %s, 表名: %s%n", database, table) ;
      }
    }
  } finally {
    reader.close();
  }
}

該組件定義了如下的事件類型

圖片圖片

上面程序輸出結果:

查詢事件:BEGIN
數據庫: testjpa, 表名: t_person
刪除事件
查詢事件:BEGIN
數據庫: testjpa, 表名: t_person
2520  30  姓名 - 30  
查詢事件:BEGIN
數據庫: testjpa, 表名: t_person
2521  44  姓名 - 44  
查詢事件:BEGIN
數據庫: testjpa, 表名: t_person
2522  92  姓名 - 92  
查詢事件:BEGIN
數據庫: testjpa, 表名: t_person
2523  71  姓名 - 71

正確的讀取binlog日志中的信息。

2.2 實時監聽Binlog日志

@Component
public class MySQLToRedisComponent implements CommandLineRunner {


  public void listener() {
    BinaryLogClient client = new BinaryLogClient("118.24.111.33", 3307, "test", "root", "123123");
    EventDeserializer eventDeserializer = new EventDeserializer();
    eventDeserializer.setCompatibilityMode(
        EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
        EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
    );
    client.setEventDeserializer(eventDeserializer);
    client.registerEventListener(new EventListener() {
        @Override
        public void onEvent(Event event) {
          EventHeader header = event.getHeader() ;
          switch(header.getEventType()) {
            case EXT_WRITE_ROWS:
              WriteRowsEventData writeData = event.getData() ;
              List<Serializable[]> rows = writeData.getRows() ;
              for (Serializable row : rows) {
                if (row.getClass().isArray()) {
                  printRow(row);
                }
              }
              break ;
            case EXT_UPDATE_ROWS:
              UpdateRowsEventData updateData = event.getData() ;
              BitSet columns = updateData.getIncludedColumns() ;
              System.err.printf("更新列: %s%n", columns) ;
              List<Entry<Serializable[], Serializable[]>> updateRows = updateData.getRows() ;
              for (Entry<Serializable[], Serializable[]> entry : updateRows) {
                printRow(entry.getKey()) ;
                System.out.println(">>>>>>>>>>>>>>>>>>>>>before") ;
                printRow(entry.getValue()) ;
                System.out.println(">>>>>>>>>>>>>>>>>>>>>after") ;
              }
              break ;
            case EXT_DELETE_ROWS:
              DeleteRowsEventData deleteData = event.getData() ;
              List<Serializable[]> deleteRow = deleteData.getRows() ;
              for (Serializable row : deleteRow) {
                if (row.getClass().isArray()) {
                  printRow(row);
                }
              }
              break ;
            case TABLE_MAP:
              TableMapEventData data = event.getData() ;
              System.out.printf("變更表: %s.%s%n", data.getDatabase(), data.getTable()) ;
              break ;
            default:
              break ;
          }
        }
        private void printRow(Serializable row) {
          Serializable[] ss = (Serializable[]) row ;
          for (Serializable s : ss) {
            if (s.getClass().isArray()) {
              System.out.print(new String((byte[])s) + "\t") ;
            } else {
              System.out.print(s + "\t") ;
            }
          }
          System.out.println() ;
        }
    });
    client.connect();
  }
  public void run(String... args) throws Exception {
    this.listener() ;
  }
}

以上監聽程序,我們僅對部分事件進行了監聽處理。當數據發生變化后,輸出如下:

變更表: test.t_person
更新列: {0, 1, 2}
1  張三  66  
>>>>>>>>>>>>>>>>>>>>>before
1  張三  22  
>>>>>>>>>>>>>>>>>>>>>after

更序列使用了BitSet表示,所以如果你要與具體的列想對應,你還應該執行如下的語句來確定具體的列名:

mysql> describe t_person;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| age   | int          | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

你可以通過JDBC的方式執行該語句獲取對應的列,也可以通過Socket方式發送命令獲取結果。推薦還是JDBC。

2.3 JMX暴露Binlog客戶端

在Spring Boot中,我們可以非常方便的通過JMX暴露binlog客戶端的相關操作,如下示例:

@Bean
BinaryLogClient client() {
  return new BinaryLogClient("118.24.111.33", 3307, "test", "root", "123123") ;
}


@Bean
MBeanExporter exporterClient(BinaryLogClient client) {
  MBeanExporter exporter = new MBeanExporter();
  exporter.setBeans(Map.of("mysql.binlog:type=BinaryLogClient", client)) ;
  return exporter;
}


@Bean
MBeanExporter exporterClientStatistics(BinaryLogClient client) {
  MBeanExporter exporter = new MBeanExporter();
  BinaryLogClientStatistics stats = new BinaryLogClientStatistics(client);
  exporter.setBeans(Map.of("mysql.binlog:type=BinaryLogClientStatistics", stats)) ;
  return exporter;
}

啟動應用后,通過JConsole查看。

圖片 圖片

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2024-07-03 08:02:19

MySQL數據搜索

2020-02-28 16:02:21

MySQL異構同步

2024-08-02 09:36:03

2023-01-31 08:34:19

2016-12-21 14:06:55

日志實現數據實時抽取

2024-10-11 11:32:22

Spring6RSocket服務

2020-09-21 11:30:28

CanalMySQL數據庫

2021-06-04 07:24:14

Flink CDC數據

2025-07-10 08:46:21

ConnectSpringBoot數據

2022-07-20 23:15:11

Flink數據集CDC

2018-05-14 13:51:39

RDS Binlog架構Kafka集群

2021-02-26 05:21:56

MySQL數據設計

2023-09-01 08:46:44

2023-05-03 08:58:46

數據庫開源

2018-08-21 10:05:59

MySQLbinlog數據庫

2024-06-12 08:46:19

2014-01-22 11:22:44

華為HANA一體機FusionCube大數據分析

2014-08-14 10:52:49

windowslinux

2024-10-18 11:39:55

MySQL數據檢索

2017-01-15 13:45:20

Docker大數據京東
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品午夜在线观看| 天天躁日日躁狠狠躁av麻豆男男| 午夜视频成人| 国产精品888| 日韩av电影国产| www欧美com| 日韩av网址大全| 7777精品伊人久久久大香线蕉最新版| 一本色道久久88亚洲精品综合| 天堂影院在线| 国产精品一区免费在线观看| 456亚洲影院| 日韩va亚洲va欧美va清高| 美女久久久久| 欧美大片日本大片免费观看| 毛葺葺老太做受视频| 国产在线xxx| 中文字幕中文字幕在线一区| 久久久99爱| 国产视频一二三四区| 日韩不卡免费视频| 91大神福利视频在线| 亚洲av鲁丝一区二区三区| 精品一区三区| 日韩成人网免费视频| 欧美成人手机在线视频| se01亚洲视频| 精品久久久久久中文字幕| 日韩精品手机在线观看| xxxxx日韩| 久久久精品国产免费观看同学| 国产成人av一区二区三区| 国产内射老熟女aaaa∵| 美女任你摸久久| 日本精品视频网站| 动漫精品一区一码二码三码四码| 亚洲澳门在线| 日韩午夜在线视频| 在线观看日本黄色| 国产亚洲精品美女久久久久久久久久| 亚洲精品久久久久| 亚洲成a人无码| 在线精品国产亚洲| 日韩一区二区三区精品视频| 欧美性受xxxx黒人xyx性爽| 国产成人精品一区二区三区视频| 色一情一乱一乱一91av| 99爱视频在线| 无码小电影在线观看网站免费| 亚洲一区二区三区自拍| 成人高清dvd| 污的网站在线观看| 亚洲国产综合91精品麻豆| www国产无套内射com| 精品日韩av| 亚洲国产美女搞黄色| 成年女人18级毛片毛片免费 | 亚洲开心激情网| 中文字幕xxx| 亚洲免费成人av在线| 日韩电影大片中文字幕| 国产全是老熟女太爽了| 精品免费一区二区| 精品国产一区二区三区久久久| 欧美xxxx精品| 自拍日韩欧美| 国内精品伊人久久| 中文字幕精品三级久久久| 久久一区二区三区超碰国产精品| 国产精品99久久久久久白浆小说 | 日韩激情电影免费看| 欧美日韩免费一区| 欧美精品一区二区三区免费播放| 日本欧美韩国| 制服丝袜亚洲网站| 真实乱偷全部视频| 欧美日韩大片免费观看| 一区二区欧美激情| 国产高潮流白浆| 日韩网站在线| 国产精品青青在线观看爽香蕉| 国产欧美久久久精品免费| 岛国一区二区在线观看| 麻豆精品视频| 久久黄色美女电影| 亚洲第一综合色| 一区二区三区入口| 成人爽a毛片免费啪啪红桃视频| 亚洲国产精品va在线看黑人 | 国产精品电影观看| 国产精品一品二区三区的使用体验| 久久久999精品免费| 欧美一区二区三区在线播放| av网站在线免费观看| 亚洲精品国产一区二区精华液| 亚洲人精品午夜射精日韩| 国产精品天堂蜜av在线播放 | 亚洲精品日韩综合观看成人91| 女人被男人躁得好爽免费视频| 蜜桃在线视频| 欧美精品一级二级| 中文字幕一区二区三区人妻不卡| 婷婷综合视频| 热草久综合在线| 不卡av中文字幕| 国产日本欧洲亚洲| 日韩av中文字幕第一页| 欧美亚洲人成在线| 精品视频中文字幕| 欧洲猛交xxxx乱大交3| 日精品一区二区| 国产精品乱码视频| 男人的天堂在线视频免费观看| 欧美视频国产精品| 特级特黄刘亦菲aaa级| 欧美成人激情| 国产成人午夜视频网址| 蜜臀久久久久久999| 综合久久久久综合| 最新天堂中文在线| 久久av中文| 午夜精品美女自拍福到在线| 国产夫妻自拍av| 国产精品乱人伦| 日本www.色| 亚洲系列另类av| 国内外成人免费激情在线视频| 国产精品自产拍| 国产精品伦理一区二区| 男女男精品视频站| 久久综合欧美| 热久久免费视频精品| 日本精品久久久久久| 一区二区三区影院| 亚洲国产成人va在线观看麻豆| 国产成人短视频在线观看| 91精品国产高清久久久久久| 欧美视频一二区| 亚洲综合激情另类小说区| 日本少妇一区二区三区| 亚洲国产精品日韩专区av有中文| 成人黄色片在线| 1024国产在线| 欧美精品久久99久久在免费线 | 一区二区国产视频| 午夜诱惑痒痒网| 亚洲国产一区二区在线观看| 91免费在线视频网站| 黄色片网站在线观看| 欧美一卡二卡在线观看| 日本aⅴ在线观看| 国产精品一区二区三区99| 久久天天东北熟女毛茸茸| 日本免费一区二区三区视频| 久久99久久99精品免观看粉嫩 | av免费看网址| 麻豆精品av| 欧美在线视频免费观看| 你懂的视频在线| 欧美午夜精品一区| 亚洲熟女毛茸茸| 国产精品资源站在线| 男人添女人下部视频免费| 给我免费播放日韩视频| 欧洲成人在线视频| 成人精品一区二区三区免费 | 亚洲国产成人av网| 亚欧洲乱码视频| 麻豆91在线观看| 99中文字幕在线观看| 澳门久久精品| 国产成人福利视频| 国产精品va在线观看视色| 欧美精品一区二区三区一线天视频| 国产精品久久久久久久久久久久久久久久久 | 91精品国产欧美一区二区成人 | 麻豆视频在线| 欧美大片顶级少妇| 黄色片中文字幕| 亚洲欧洲精品天堂一级 | 性欧美在线看片a免费观看| 青青青草原在线| 7777女厕盗摄久久久| 日本一区二区不卡在线| 国产欧美综合在线观看第十页 | 国产999精品在线观看| 欧美激情欧美激情在线五月| 精品乱码一区二区三四区视频| 欧美日韩国产美| 日韩人妻无码一区二区三区99| 国产女人aaa级久久久级| 欧美xxxxxbbbbb| 天堂影院一区二区| www.激情网| 欧美熟乱15p| 国产一区二区久久久| 亚洲一区二区三区久久久| 午夜欧美不卡精品aaaaa| 巨大荫蒂视频欧美大片| 亚洲美女免费精品视频在线观看| 国产精品国产三级国产aⅴ| 精品国产福利在线| 日韩女优一区二区| 2020国产精品自拍| 欧美日韩一区二区区别是什么 | 国产欧美日本| 好吊色视频988gao在线观看| 国产精品亚洲人成在99www| 99伊人久久| 亚洲人体在线| 国产精品wwwwww| 国产在线美女| 欧美日本精品在线| 1pondo在线播放免费| 亚洲欧美www| www.蜜臀av.com| 欧美另类高清zo欧美| 久久久精品毛片| 精品久久久久久久久中文字幕 | 老司机精品福利视频| www.好吊操| 欧美午夜a级限制福利片| 亚洲日本无吗高清不卡| 国产一区网站| 欧美激情www| 一道在线中文一区二区三区| 韩国一区二区三区美女美女秀| 欧美高清hd| 91久久国产自产拍夜夜嗨| 疯狂欧洲av久久成人av电影 | 91成人在线观看喷潮教学| 亚洲网址在线| 国产一二三区在线播放| 欧美天天在线| 欧美日韩福利在线| 极品av少妇一区二区| 高清无码视频直接看| 亚洲自拍偷拍网| 国产欧美123| 黄色欧美成人| www在线观看免费| 亚洲麻豆一区| 蜜桃传媒一区二区三区| 国产欧美大片| 成人免费观看毛片| 久久精品观看| 黄色在线视频网| 久久狠狠亚洲综合| 激情久久综合网| 国产精品99久久久久久久vr| 久久久久久久久久久久国产精品| 成人中文字幕电影| 强迫凌虐淫辱の牝奴在线观看| 成人av片在线观看| 野花社区视频在线观看| 久久久噜噜噜久久人人看| 黄色在线观看av| 久久久久久久综合| 日本美女黄色一级片| 综合久久久久久| 国产污视频在线看| 日本久久电影网| 亚洲最大成人av| 日韩视频在线一区二区| 色呦呦中文字幕| 亚洲欧美成人网| 麻豆传媒视频在线| 欧美激情区在线播放| 日韩影院在线| 国产精品偷伦一区二区| 国产精品国产三级在线观看| 国产精品免费一区二区三区在线观看 | 欧美成人黄色网| 亚洲成人一二三| 波多野结衣在线观看视频| 欧美高清激情brazzers| 黄色片一区二区| 国产一区二区三区直播精品电影 | 樱桃国产成人精品视频| 日韩女同强女同hd| 欧美日韩欧美一区二区| 丰满肉嫩西川结衣av| 亚洲图片欧美午夜| 四虎影院观看视频在线观看 | 久久久久久久久久久久久久久久久久久久| 精品在线观看一区二区| 色婷婷亚洲mv天堂mv在影片| 欧美这里只有精品| 日本麻豆一区二区三区视频| 又黄又爽又色的视频| 国产亚洲一区字幕| 中文字幕av久久爽av| 在线欧美日韩国产| 精品人妻一区二区三区浪潮在线 | 先锋在线资源一区二区三区| 欧美福利电影在线观看| 能在线观看的av网站| 国产成人精品午夜视频免费| 中文字幕网站在线观看| 亚洲成人福利片| 国产精品一品二区三区的使用体验| 亚洲精品第一国产综合精品| 国产三区视频在线观看| 国产国语videosex另类| 久久视频在线观看| 吴梦梦av在线| 日韩精品免费视频人成| 四季av综合网站| 亚洲免费av高清| 国产天堂第一区| 国产网站欧美日韩免费精品在线观看| 中文在线观看免费| 国产日韩av在线播放| 久久不见久久见国语| 狠狠干 狠狠操| 国产91色综合久久免费分享| 久艹在线观看视频| 欧美午夜精品一区二区蜜桃| 每日更新在线观看av| 国外成人在线播放| 99精品中文字幕在线不卡| 精品少妇人妻av一区二区| 美国av一区二区| 日韩中文字幕有码| 欧美性猛交xxxx免费看| 秋霞av鲁丝片一区二区| 欧美大片第1页| 免费精品一区| 日本三日本三级少妇三级66| 麻豆精品一二三| 国产精品久久久视频| 91官网在线观看| 国产在线一二| 国产91免费看片| 精品美女久久久| 不卡av免费在线| 欧美精彩视频一区二区三区| 黄色在线视频网址| 亚洲精品国产精品乱码不99按摩 | 欧美视频中文字幕在线| 天堂中文在线官网| 欧美性受xxx| 综合亚洲自拍| 国内外免费激情视频| 国产午夜亚洲精品午夜鲁丝片| 午夜一区二区三区四区| 在线视频一区二区| 亚洲欧美在线综合| 欧美黄网在线观看| www.日本不卡| 九九精品免费视频| 中文字幕久久精品| 视频欧美精品| 国产亚洲精品久久久久久久| 成人激情黄色小说| 99精品在线播放| 中文字幕在线看视频国产欧美在线看完整| www.成人在线视频| 国产高潮呻吟久久久| 丁香另类激情小说| 伦av综合一区| 日韩一区二区在线视频| 日韩高清二区| 日本a在线免费观看| 国产亚洲一区字幕| 99久久免费国产精精品| 久久久伊人欧美| 国产99亚洲| 久久久久久久久久一区| 亚洲在线视频一区| 四虎影院在线播放| 成人国产精品久久久| 欧美午夜免费影院| 新91视频在线观看| 欧美人与禽zozo性伦| 污污的网站在线看| 欧美亚州在线观看| 国产中文一区二区三区| 国产香蕉在线视频| 在线看欧美日韩| 69精品国产久热在线观看| 日韩欧美在线免费观看视频| 一区二区三区欧美亚洲| 欧洲亚洲精品视频| 亚洲一区二区三区视频| 性伦欧美刺激片在线观看| 日本少妇aaa| 日韩精品在线观看视频| 欧洲亚洲精品| 116极品美女午夜一级| 日韩一区日韩二区| 青青久在线视频| av一区二区三区四区电影| 日韩1区2区3区| 国产在线视频你懂的| 日韩中文字幕不卡视频| 麻豆成人入口| 91视频免费入口| 欧美日韩在线播放三区四区| 香蕉伊大人中文在线观看|