数据变化监听实现

前言

       今天纯粹是无聊随便看看,然后发现有个好东西,可能可以用于某些数据变化主动监听场景搞事情.废话不多说,直接上货.


一、Binlog4j是什么

       轻量级 Mysql Binlog 客户端,提供宕机续读,高可用集群等特性

二、项目特性

  • 集群模式,通过集群部署的方式,保证服务高可用。
  • 宕机续读,避免宕机期间造成数据丢失
  • 数据转换,基于泛型封装 binlog Event 的序列化数据
  • 兼容 传统项目 与 Spring Boot / Cloud 项目
  • 兼容 Spring Boot 2.x 与 Spring Boot 3.x 版本

三、使用步骤

1.引入库

<dependency><groupId>com.gitee.Jmysy</groupId><artifactId>binlog4j-core</artifactId><version>latest.version</version>
</dependency>
<dependency><groupId>com.gitee.Jmysy</groupId><artifactId>binlog4j-spring-boot-starter</artifactId><version>latest.version</version>
</dependency>

2.使用

       通过 BinlogClient 创建 binlog 客户端,IBinlogEventHandler 用于接受 binlog 事件通知,该接口允许使用泛型,数据将遵循驼峰规则进行封装。

public class BootStrap {public static void main(String[] args) {BinlogClientConfig clientConfig = new BinlogClientConfig();clientConfig.setHost("127.0.0.1");clientConfig.setPort(3306);clientConfig.setUsername("root");clientConfig.setPassword("taoren@123");clientConfig.setServerId(1990);IBinlogClient binlogClient = new BinlogClient(clientConfig);binlogClient.registerEventHandler("database", "table", new IBinlogEventHandler() {@Overridepublic void onInsert(BinlogEvent event) {System.out.println("插入数据:{}", event.getData());}@Overridepublic void onUpdate(BinlogEvent event) {System.out.println("修改数据:{}", event.getData());}@Overridepublic void onDelete(BinlogEvent event) {System.out.println("删除数据:{}", event.getData());}});binlogClient.connect();}
}

3、高级特性使用

       通过 Persistence 配置为 true 启用宕机续读功能,Binlog4j 会将 binlog 的 filename 与 position 记录到 redis, 所以同时你需要设置 Redis 配置.
先在 application.yml 中填写 BinlogClient 配置

spring:binlog4j:redis-config:host: 127.0.0.1port: 6379password: taoren@123client-configs:master:username: rootpassword: taoren@123host: 127.0.0.1port: 3306serverId: 1990
public class BootStrap {public static void main(String[] args) {RedisConfig redisConfig = new RedisConfig();redisConfig.setHost("127.0.0.1");redisConfig.setPort(6379);redisConfig.setPassword("taoren@123");BinlogClientConfig clientConfig = new BinlogClientConfig();clientConfig.setHost("127.0.0.1");clientConfig.setPort(3306);clientConfig.setUsername("root");clientConfig.setPassword("taoren@123");clientConfig.setServerId(1990); // Client 编号clientConfig.setRedisConfig(redisConfig); // Redis 配置clientConfig.setPersistence(true); // 启用持久化 (宕机重启后, 从上次读取的位置开始)clientConfig.setMode(BinlogClientMode.cluster); // 高可用集群BinlogClient binlogClient = new BinlogClient(clientConfig);binlogClient.registerEventHandler("database", "table", new IBinlogEventHandler<User>() {@Overridepublic void onInsert(BinlogEvent<User> event) {System.out.println("插入数据:{}", event.getData());}@Overridepublic void onUpdate(BinlogEvent<User> event) {System.out.println("修改数据:{}", event.getData());}@Overridepublic void onDelete(BinlogEvent<User> event) {System.out.println("删除数据:{}", event.getData());}});binlogClient.connect();}
}

单表监测
       使用 @BinlogSubscriber 注解,指定 IBinlogEventHandler 需要注册到哪个客户端,并且指定监听的 database 与 table

@BinlogSubscriber(clientName = "master", database = "pear-admin", table ="sys_user")
public class UserEventHandler implements IBinlogEventHandler<User> {@Overridepublic void onInsert(BinlogEvent<User> event) {System.out.println("插入数据:" + event.getData());}@Overridepublic void onUpdate(BinlogEvent<User> event) {System.out.println("修改数据:" + event.getData());}@Overridepublic void onDelete(BinlogEvent<User> event) {System.out.println("删除数据:" + event.getData());}}

多表监测
       @BinlogSubscriber 注解 database 与 table 属性支持 Pattern 匹配,IBinlogEventHandler 在不指定泛型的情况下,event.getData () 为 Map<String, Object> 类型,用于兼容不同表的数据结构

@BinlogSubscriber(clientName = "master", database = ".*", table ="sys.*")
public class UserEventHandler implements IBinlogEventHandler {@Overridepublic void onInsert(BinlogEvent event) {System.out.println("数据库:" + event.getDatabase());System.out.println("数据表:" + event.getTable());System.out.println("新数据:" + event.getData());}@Overridepublic void onUpdate(BinlogEvent event) {System.out.println("数据库:" + event.getDatabase());System.out.println("数据表:" + event.getTable());System.out.println("原数据:" + event.getOriginalData());System.out.println("新数据:" + event.getData());}@Overridepublic void onDelete(BinlogEvent event) {System.out.println("数据库:" + event.getDatabase());System.out.println("数据表:" + event.getTable());System.out.println("新数据:" + event.getData());}}

示例补充
1、监听 master 数据源所有数据库中所有表的数据变化【最灵活】
       @BinlogSubscriber(clientName = “master”)

2、监听 master 数据源 pear-admin 数据库中所有表的数据变化
       @BinlogSubscriber(clientName = “master”, database=“pear-admin”)

3、监听 master 数据源 pear-admin 数据库中 user 表的数据变化
       @BinlogSubscriber(clientName = “master”, database=“pear-admin”, table=“user”)

4、监听 master 数据源所有数据库中 user 表的数据变化
       @BinlogSubscriber(clientName = “master”, table=“user”)

5、监听 master 数据源所有数据库中以 user 开头的表的数据变化
       @BinlogSubscriber(clientName = “master”, table=“user.*”)


总结

  • 现在是纯分享,感觉比传统监听简单
  • 觉得可以搞事情,不过暂时还没有遇到这样的业务,先记录下,留个思路印象
    希望可以帮到大家,uping!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebDAV之π-Disk派盘 + 思源笔记

思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。 融合块、大纲和双向链接,重构你的思维。 π-Disk派盘 – 知识管理专家 派盘是一款面向个人和企业的本地云存储解决方案,它可以帮助用户打造“数字第二大脑”,并支持KMS知识管理系…

Vector Search with OpenAI Embeddings: Lucene Is All You Need

本文是LLM系列文章&#xff0c;针对《Vector Search with OpenAI Embeddings: Lucene Is All You Need》的翻译。 使用OpenAI嵌入的向量搜索&#xff1a;Lucence是你所需的一切 摘要1 引言2 从架构到实现3 实验4 讨论5 结论 摘要 我们在流行的MS MARCO文章排名测试集上使用Lu…

专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航

8月25日&#xff0c;第二十六届成都国际汽车展览会在中国西部国际博览城隆重开幕。车展举办期间&#xff0c;远航汽车董事长远勤山先生、产品研发总监王震先生向媒体分享了远航汽车品牌发展、产品研发、技术创新以及市场布局等内容。 “通过我们的付出和努力&#xff0c;让我们…

全网最新最全软件测试工程师面试题,看完金九银十还怕拿不到offer?

与开发工程师相比&#xff0c;软件测试工程师前期可能不会太深&#xff0c;但涉及面还是很广的。 在一年左右的实习生或岗位的早期面试中&#xff0c;主要是问一些基本的问题。 涉及到的知识主要包括MySQL数据库的使用、Linux操作系统的使用、软件测试框架问题、测试环境搭建问…

kafka 命令脚本说明以及在java中使用

一、命令行使用 1.1、topic 命令 1、关于topic,这里用window 来示例 bin\windows\kafka-topics.bat2、创建 first topic,五个分区&#xff0c;1个副本 bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --create --partitions 5 --replication-factor 1 -…

OpenCv读/写视频色差 方案

OpenCv read / write video color differenceOpenCv读/写视频色差 感谢博主&#xff1a; OpenCv读/写视频色差答案 - 爱码网 有没有办法让 OpenCV 使用正确的转换&#xff1f;&#xff1f; 是的&#xff0c;使用 GStreamer 后端而不是 FFmpeg 后端&#xff0c;颜色看起来很完…

本地缓存、Redis数据缓存策略

目录 需求看似简单&#xff0c;一取一传但是&#xff0c;又出现了一个新的问题&#xff0c;数据丢了。 一、缓存缓存有哪些分类&#xff1a; 二、分析一下本地缓存的优势三、本地缓存解决方案&#xff1f;1、基于Guava Cache实现本地缓存2、基于Caffeine实现本地缓存3、基于Enc…

无涯教程-Flutter - Dart简介

Dart是一种开源通用编程语言&#xff0c;它最初是由Google开发的&#xff0c; Dart是一种具有C样式语法的面向对象的语言&#xff0c;它支持诸如接口&#xff0c;类之类的编程概念&#xff0c;与其他编程语言不同&#xff0c;Dart不支持数组&#xff0c; Dart集合可用于复制数据…

来和稚晖君做同事,校招内推、社招、实习

先上校招官网投递链接和内推码。 投递链接&#xff1a;http://www.agibot.com/ 我的内推码&#xff1a;MVKRCCW 智元机器人开始校招了&#xff0c;众多岗位如下&#xff1a; 公司正在不断发展壮大中&#xff0c;需要优秀的毕业生加入&#xff0c;一块来搞点有意思的事情。稚…

访问 GitHub 方法

访问 GitHub 方法 方法一&#xff1a;最常见的就是 fq&#xff0c;但这个是违法的行为&#xff0c;自己私下搞可以&#xff0c;不能教你们。 方法二&#xff1a;利用加速器&#xff0c;这是正规合法操作。这里推荐一个免费的加速器&#xff0c;下载安装 Watt Toolkit加速器,原名…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中&#xff0c;spark在数据处理、传统机器学习训练、 深度学习相关业务&#xff0c;能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理&#xff0c;介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

1+X智慧安防系统实施与运维技能等级证产教融合基地建设方案

一、系统概述 1X智慧安防系统实施与运维技能等级证产教融合体系统融合了产业需求、教育培训和技能认证&#xff0c;通过课程培训、实训基地和实习实训等方式培养学员的技能水平&#xff0c;并通过技能认证来评估其能力&#xff0c;以满足智慧安防行业对人才的需求&#xff0c;并…

迈向无限可能, ATEN宏正领跑设备切换行业革命!

随着互联网在各个领域的广泛应用,线上办公这一不受时间和地点制约、不受发展空间限制的办公模式开始广受追捧,预示着经济的发展正朝着新潮与活跃的方向不断跃进。当然,在互联网时代的背景下,多线程、多设备的线上办公模式也催生了许多问题:多设备间无法进行高速传输、切换;为保…

能直接运营的发接任务平台小程序搭建开发演示

有个项目估计做过互联网的小伙伴都听说过——发接任务平台。 基本每年都有发接任务平台关站&#xff0c;但又有新的平台出来&#xff0c;往复循环&#xff0c;无比热闹。这在互联网圈不常见&#xff0c;互联网项目很多都是风头过去了就结束了&#xff0c;但发接任务年年似乎都…

电商项目part10 高并发缓存实战

缓存的数据一致性 只要使用到缓存&#xff0c;无论是本地内存做缓存还是使用 redis 做缓存&#xff0c;那么就会存在数据同步的问题。 先读缓存数据&#xff0c;缓存数据有&#xff0c;则立即返回结果&#xff1b;如果没有数据&#xff0c;则从数据库读数据&#xff0c;并且把…

hadoop2.2.0伪分布式搭建

1.准备Linux环境 1.0点击VMware快捷方式&#xff0c;右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip 设置网段&#xff1a;192.168.1.0 子网掩码&#xff1a;255.255.255.0 -> apply -> ok 回到windows --> 打开…

spring 错误百科

一、使用Spring出错根源 1、隐式规则的存在 你可能忽略了 Sping Boot 中 SpringBootApplication 是有一个默认的扫描包范围的。这就是一个隐私规则。如果你原本不知道&#xff0c;那么犯错概率还是很高的。类似的案例这里不再赘述。 2、默认配置不合理 3、追求奇技淫巧 4、…

iOS系统修复软件 Fix My iPhone for Mac

Fix My iPhone for Mac是一款iOS系统恢复工具。修复您的iPhone卡在Apple徽标&#xff0c;黑屏&#xff0c;冻结屏幕&#xff0c;iTunes更新/还原错误和超过20个iOS 12升级失败。这个macOS桌面应用程序提供快速&#xff0c;即时的解决方案来修复您的iOS系统问题&#xff0c;而不…

Swift创建单例

Objective-C使用GCD 中的dispatch_once_t 可以保证里面的代码只被调用一次&#xff0c;以此保证单例在线程上的安全。 但是在Swift 中由于废弃了原有的Dispatch once方法&#xff0c;因此无法使用once 进行单例的创建。 我们可以使用struct 存储类型变量&#xff0c;并且使用…

记录一下自己对linux分区挂载的理解

一直狠模糊&#xff0c;分两个区&#xff0c;一个挂载/, 一个挂载/home 两者是什么关系 实测 先看挂载的内容 然后umount /home后创建一个新文件 再挂载回去 发现旧分区又回来了&#xff0c;说明路径只是个抽象的概念&#xff0c;分区挂载&#xff0c;互相之间数据是不影响…