精品欧美一区二区三区在线观看 _久久久久国色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一区二区三区| 国产成人ay| 制服丝袜成人动漫| www.av毛片| 成人亚洲性情网站www在线观看| 久久国产精品露脸对白| 久久久久久久国产| 山东少妇露脸刺激对白在线| 视频精品一区二区三区| 欧美日韩美女在线观看| youjizz.com亚洲| 色婷婷av一区二区三| 蜜臀av一区二区在线免费观看| 久久亚洲国产精品成人av秋霞| 亚洲第一区在线观看| 亚洲精品国产精品国自产观看| 国产黄a三级三级三级| 国产一区91| 久久九九热免费视频| 波多野结衣 在线| 亚洲三级av| 欧美区视频在线观看| 日本日本19xxxⅹhd乱影响| 在线观看的av| 久久久久一区二区三区四区| av成人免费观看| 中文字幕在线播放日韩| 国产精品嫩草99av在线| 毛片精品免费在线观看| a级在线免费观看| 久久久伦理片| 日韩免费视频一区| 色婷婷.com| 日韩天堂在线| 黑人巨大精品欧美一区二区免费| 免费极品av一视觉盛宴| 久久99精品久久| 国产精品美女久久久久久久网站| 欧美日韩天天操| 手机av免费在线观看| 国产麻豆一精品一av一免费| 国产精品美乳一区二区免费| 中文字幕一区二区三区精品| 99精品美女| 一夜七次郎国产精品亚洲| 五级黄高潮片90分钟视频| 亚洲小说春色综合另类电影| 日韩美女主播在线视频一区二区三区| 成人av毛片在线观看| 欧美v亚洲v综合v国产v仙踪林| 色播五月激情综合网| 波多野结衣家庭教师视频| 高h视频在线播放| 一区二区高清视频在线观看| 法国空姐在线观看免费| 国内精品久久久久久野外| 日韩一区在线播放| 国产成人三级视频| 黄色一级片在线观看| 国产精品第13页| 制服诱惑一区| dy888亚洲精品一区二区三区| 1区2区3区精品视频| 中文字幕一区二区三区四区五区六区| аⅴ资源新版在线天堂| 亚洲国产精品av| 一区二区精品国产| 黄色网址在线免费| 亚洲动漫第一页| 女人色极品影院| √最新版天堂资源网在线| 欧美日韩免费网站| 国产一线二线三线在线观看| 久久人人视频| 欧美一区二区视频在线观看| caopor在线| 亚洲精品小区久久久久久| 国产一区二区美女视频| 亚洲精品久久久久久国| 欧美一区二区三区久久精品| 国语自产精品视频在免费| 四虎精品永久在线| 秋霞电影网一区二区| 5g影院天天爽成人免费下载| 精品人妻一区二区三区蜜桃| 99国产精品久久久久久久久久久| 日本精品一区| 欧美videosex性欧美黑吊| 富二代精品短视频| 91小视频在线播放| 日韩av网站在线免费观看| 在线视频免费一区二区| 欧美精品xxxxx| 石原莉奈一区二区三区在线观看| 国产日本欧美在线观看| 天天摸天天干天天操| 中文字幕av一区二区三区高| 日本欧美视频在线观看| 99久久精品一区二区成人| 精品成人佐山爱一区二区| 妺妺窝人体色WWW精品| 国产一区清纯| 91精品国产自产在线观看永久| 手机看片1024日韩| 亚洲欧美一区二区久久| 国产av无码专区亚洲精品| 欧美午夜在线播放| 在线观看久久久久久| 国产成人精品亚洲男人的天堂| 美女看a上一区| 精品日本一区二区三区在线观看| 国产淫片在线观看| 91久久精品一区二区三区| www男人天堂| 亚洲精品a级片| 国产精品福利网站| 午夜18视频在线观看| 亚洲精品视频免费看| 欧美天堂亚洲电影院在线播放| 国产大尺度在线观看| 东京一区二区| 亚洲第一精品夜夜躁人人爽 | 日本午夜视频在线观看| 国产一区福利在线| 日韩电影在线播放| 筱崎爱全乳无删减在线观看| 欧美变态tickling挠脚心| 精品在线观看一区| 蜜臀久久99精品久久久画质超高清| 免费久久一级欧美特大黄| 精灵使的剑舞无删减版在线观看| 51精品视频一区二区三区| 国产视频不卡在线| 日韩成人精品在线| 久久久久无码国产精品一区| 黑人玩欧美人三根一起进| 欧美一区二区精品| 欧美成人777| 激情成人午夜视频| 久久久一二三四| 99热这里有精品| 久久精品电影一区二区| 91免费视频播放| 中文字幕在线观看不卡| 一区二区三区韩国| 日韩av久操| 国产日韩在线视频| 免费av在线网址| 欧美一级二级在线观看| 激情五月婷婷在线| 成人免费va视频| 浮妇高潮喷白浆视频| 日日狠狠久久偷偷综合色| 热久久一区二区| 神马一区二区影院| 国产精品伦一区二区| 日韩中文字幕第一页| 精品国产www| 国产精品色哟哟网站| 欧美成人福利在线观看| 国产精品伦理久久久久久| 亚洲一区亚洲二区亚洲三区| 毛片在线导航| 日韩国产中文字幕| 欧美a视频在线观看| 国产日韩影视精品| 久久国产这里只有精品| 99视频精品视频高清免费| 91在线|亚洲| 欧美大片黄色| 亚洲国产日韩欧美在线99| 久久久久女人精品毛片九一| 国产欧美一区在线| 国产精品第12页| 四虎国产精品免费观看| 99国精产品一二二线| 在线黄色的网站| 在线观看久久久久久| 午夜精品一二三区| 色哟哟在线观看一区二区三区| 久久久久亚洲AV成人无在 | 亚洲天堂国产视频| 欧美日韩网站| 精品一区国产| 欧美成人一二区| 久久久亚洲影院你懂的| 日本一区高清| 欧美一区二区三区视频| 日韩一区不卡| 天天影院图片亚洲| 欧美精品三级在线观看| 久久久久久久久久久久久久久久久| 99视频超级精品| 久久久久国产一区| 国模 一区 二区 三区| 欧美一区三区二区在线观看| 成人在线精品| 青青久久av北条麻妃海外网| а天堂中文在线官网| 精品视频在线播放| 国产免费高清视频| 色琪琪一区二区三区亚洲区| 免费无码毛片一区二区app| 国产亚洲欧美在线| 日本天堂在线播放| 久久99国产精品麻豆| 99精品在线免费视频| 你懂的一区二区| 视频在线观看成人| 欧洲亚洲成人| 91九色蝌蚪成人| www.国产精品| 欧美一级视频一区二区| 2024最新电影在线免费观看| 国产一区二区久久精品| 三级视频在线看| 日韩一级完整毛片| 真实的国产乱xxxx在线91| 精品女厕一区二区三区| 五月婷婷一区二区| 日韩一区在线看| 欧美人妻一区二区三区| 91网址在线看| 久久久久久久人妻无码中文字幕爆| 久久99热这里只有精品| 成人在线观看a| 麻豆精品91| 玩弄中年熟妇正在播放| 亚洲国产日韩欧美一区二区三区| japanese在线视频| 99久久综合| 亚洲一区在线直播| 日韩一区二区在线免费| 亚洲精品国产精品国自产观看| 国产探花在线精品| 鲁鲁狠狠狠7777一区二区| 国产欧美一区二区三区米奇| 97人人干人人| 亚洲精品一区国产| 99久久久久国产精品免费| 亚洲国产欧美国产第一区| 91欧美精品成人综合在线观看| 国产精品久久久久久妇女| 国产精品久久久久久久久久免费 | 久久午夜精品一区二区| 女性女同性aⅴ免费观女性恋| 亚洲精品欧洲| 日韩av在线第一页| 免费看的黄色欧美网站| 欧美成人精品欧美一级乱| 美女尤物久久精品| 中文字幕一区二区三区四区在线视频| 日本一不卡视频| 一区二区免费av| 国产精品白丝jk黑袜喷水| 日本一级大毛片a一| 99久久夜色精品国产网站| 天天躁日日躁aaaxxⅹ| 国产日产欧美一区二区视频| 丰满的亚洲女人毛茸茸| 亚洲欧洲日韩综合一区二区| 亚洲人与黑人屁股眼交| 一区二区三区欧美久久| 日本三级午夜理伦三级三| 精品福利免费观看| 蜜臀尤物一区二区三区直播| 欧美精品九九99久久| 亚洲av无码一区二区乱子伦| 精品国产亚洲在线| 日本一二三区在线视频| 色多多国产成人永久免费网站| 在线观看中文字幕的网站| 911国产网站尤物在线观看| 成人在线爆射| 91久久爱成人| 日韩理论电影中文字幕| 色一情一乱一伦一区二区三区| 手机亚洲手机国产手机日韩| 国产中文字幕乱人伦在线观看| 国产精品日韩精品欧美精品| 538在线视频观看| 国产高清不卡一区二区| 亚洲做受高潮无遮挡| 亚洲视频小说图片| 亚洲免费在线视频观看| 7777精品伊人久久久大香线蕉的 | 男操女免费网站| 国产福利一区二区三区视频 | 欧美大肥婆大肥bbbbb| 欧美少妇精品| 成人欧美一区二区三区在线| 日韩精品免费一区二区夜夜嗨| 一区二区在线观| 国产欧美三级| 国产精品999.| 国产视频不卡一区| 久久网一区二区| 欧美色精品在线视频| 欧美自拍偷拍第一页| 最近2019中文字幕在线高清| av资源中文在线天堂| 成人国产精品av| 国产99久久精品一区二区300| 成年在线观看视频| 美女精品自拍一二三四| 久久久国产精品无码| 亚洲欧美偷拍另类a∨色屁股| 无码日韩精品一区二区| 亚洲精品一线二线三线无人区| 国产区在线视频| 17婷婷久久www| 亚洲一区二区三区四区电影| 中文字幕一区二区三区最新 | 白丝校花扒腿让我c| 中文字幕不卡在线| 久久久黄色大片| 亚洲国产精品高清久久久| 在线播放免费av| 成人免费看吃奶视频网站| 欧美色蜜桃97| 日本不卡在线观看视频| 成人高清在线视频| 免费一级片视频| 日韩片之四级片| av在线官网| 亚洲va男人天堂| 99视频精品全部免费在线视频| 一区二区三区 欧美| 国产亚洲精品7777| 国产区一区二区三| 亚洲精品97久久| 91超碰在线| 国产麻豆日韩| 91嫩草|国产丨精品入口| 亚洲精品中文在线| 国产精品一区二区av白丝下载 | 捆绑调教美女网站视频一区| 熟女少妇内射日韩亚洲| 色94色欧美sute亚洲线路一ni| 日韩电影免费| 日韩美女免费视频| 国产va免费精品观看精品视频| 国产精品97在线| 久久久午夜电影| 成人免费一级片| 在线亚洲男人天堂| 深夜日韩欧美| 欧美爱爱视频网站| 国产精品一区二区免费不卡| 欧美成人片在线观看| 欧美变态凌虐bdsm| bbw在线视频| 免费成人深夜夜行视频| 久久国产66| 欧美巨胸大乳hitomi| 欧美日韩一级片网站| 国产在线1区| 国产91亚洲精品一区二区三区| 亚洲一级黄色| 黄色aaa视频| 欧美日韩一区二区三区在线| 男人影院在线观看| 99精品在线直播| 国产欧美综合一区二区三区| 国产精品高清无码在线观看| 欧美日韩午夜影院| 香蕉久久aⅴ一区二区三区| 国产成人精品免费视频大全最热| 亚洲少妇诱惑| 高清国产在线观看| 欧美一区二区播放| 国产伦理精品| 亚洲蜜桃在线| 粉嫩av一区二区三区粉嫩| 中文字幕超碰在线| 中文字幕欧美精品在线| 免费看日产一区二区三区| 国产96在线 | 亚洲| 中国av一区二区三区| 亚洲av无码专区在线| 日韩av电影手机在线| 羞羞答答成人影院www| 中文字幕人妻一区二区三区| 欧美日精品一区视频| 日韩伦理av| 日韩精品资源| 成人免费视频视频在线观看免费| 99re这里只有精品在线| 久久影院在线观看| 亚洲香蕉视频| 一级黄色大片免费看| 日韩欧美在线视频| 在线看福利影| 亚洲草草视频| 99国产精品久久久| 99精品视频在线播放免费| 欧美一区二区影院| 欧美一区精品|