使用 Canal + 责任链模式实现 Mysql 和 Redis 同步
前言
现在公司的项目实际场景中,当数据库的内容变更时,需要刷新缓存。当前的情况,经常把操作 Redis 缓存的代码耦合到了核心业务代码中,为了使之解耦,引入了 Canal 中间件。当数据库发生写入操作时,缓存可以自动刷新,实现刷新缓存的操作对核心业务代码的零侵入。
Canal 介绍
Canal 是Alibaba 开源的一个由 java 开发,基于数据库增量 binlog 日志解析,提供增量数据订阅和消费的中间件,目前只支持 mysql。
用途
Canal 可以用来作:
- 数据库镜像
- 数据库实时备份
- 多级索引 (卖家和买家各自分库索引)
- search build
- 业务cache刷新
- 价格变化等重要业务消息
工作原理
Canal的工作原理是通过订阅 Master 主库的 binlog 日志,自身伪装成一个 Slave 节点,向 master发送 dump 协议,master 收到 dump 协议后,向 Canal 发送 binlog,Canal 收到 binlog后,对其进行解析。
注意:mysql 实现主从同步须要开启 binlog 和 Row模式
Canal Server 的下载和安装可以查看官方文档 https://github.com/alibaba/canal
项目介绍
了解了 Canal 的原理后开发就会变得很便捷,对此写了一个利用 Canal 同步 Mysql 和 Redis 的 Canal 客户端架子。
项目 git 地址:https://github.com/zhengyakai/canal-sync-mysql-redis
因为 Canal 客户端要处理 Canal 服务端的 “INSERT”、“DELETE”、“UPDATE”事件,最先想到的设计模式是事件监听器模式和责任链模式,二者都很符合该应用场景。
二者我都实现、对比了下,事件监听器模式是借助于 Spring 提供的 ApplicationListener 来实现,代码复杂些,责任链模式更简单。
- Title: 使用 Canal + 责任链模式实现 Mysql 和 Redis 同步
- Author: 薛定谔的汪
- Created at : 2018-09-23 18:01:54
- Updated at : 2023-11-17 19:37:37
- Link: https://www.zhengyk.cn/2018/09/23/framework/canal-sync-mysql-redis/
- License: This work is licensed under CC BY-NC-SA 4.0.