Canal实现0侵入同步缓存数据

news2024/11/25 15:58:28

开启MySQL binlog功能

cd /home/mysql8/conf
vim my.cnf

[mysqld]
log-bin=/var/lib/mysql/mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
binlog-do-db=imooc-hire-dev # 配置binlog给哪个数据库使用

重启MySQL:
docker restart mysql
检测binlog是否开启:
在这里插入图片描述
在这里插入图片描述

Docker安装Canal

docker pull canal/canal-server:v1.1.6
docker run -p 11111:11111 --name canal -e canal.destinations=imooc -e canal.instance.mysql.slaveId=20231111 -e canal.instance.master.address=192.168.233.128:3306 -e canal.instance.dbUsername=root -e canal.instance.dbPassword=Admin~123456 -e canal.instance.connectionCharset=UTF-8 -e canal.instance.filter.regex=imooc-hire-dev.data_dictionary --restart=always -d canal/canal-server:v1.1.6

canal.destinations=imooc表示起个名字跟后面的yml中对应上即可;
canal.instance.master.address=192.168.233.128:3306表示监听的数据库ip和端口;
canal.instance.filter.regex=imooc-hire-dev.data_dictionary表示的是监听imooc-hire-dev库的data_dictionary表,可以逗号分隔,多张表;
canal.instance.dbUsername=root -e canal.instance.dbPassword=Admin~123456表示被监听的数据库账号密码;

查看是否启动成功:

docker exec -it canal bash
cd canal-server/logs/imooc
vi imooc.log

在这里插入图片描述
不报错就对了。

SpringBoot集成Canal实现0侵入缓存同步

        <dependency>
            <groupId>top.javatool</groupId>
            <artifactId>canal-spring-boot-starter</artifactId>
            <version>1.2.1-RELEASE</version>
        </dependency>

yml

canal:
  destination: imooc
  server: 192.168.233.128:11111
  user-name: canal
  password: canal

logging:
  level:
    top.javatool.canal.client: warn
package com.imooc.canal;

import com.imooc.base.BaseInfoProperties;
import com.imooc.pojo.DataDictionary;
import com.imooc.pojo.co.DataDictionaryCO;
import com.imooc.utils.GsonUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

import java.util.ArrayList;
import java.util.List;

@CanalTable("data_dictionary")      // 指定监听的表名
@Component
public class DataDictSyncHelper extends BaseInfoProperties
        implements EntryHandler<DataDictionaryCO> // 指定表关联的实体对象(javabean)
{

    private static final String DDKEY_PREFIX = DATA_DICTIONARY_LIST_TYPECODE + ":";

    @Override
    public void insert(DataDictionaryCO dataDictionary) {
        String ddkey = DDKEY_PREFIX + dataDictionary.getType_code();

        // 先查询redis中是否存在该数据字典list
        String ddListStr = redis.get(ddkey);
        List<DataDictionary> redisDDList = null;
        if (StringUtils.isBlank(ddListStr)) {
            // 如果不存在,则直接new一个list,添加并存入到redis中即可
            redisDDList = new ArrayList<>();
        } else {
            // 如果redis中存在该list,则直接在缓存的list中新增即可
            redisDDList = GsonUtils.stringToListAnother(ddListStr,
                                                        DataDictionary.class);
        }

        // 转换对象并且塞入list
        DataDictionary pendingDictionary = convertDD(dataDictionary);
        redisDDList.add(pendingDictionary);
        redis.set(ddkey, GsonUtils.object2String(redisDDList));
    }

    private DataDictionary convertDD(DataDictionaryCO dataDictionaryCO) {
        DataDictionary pendingDictionary = new DataDictionary();
        BeanUtils.copyProperties(dataDictionaryCO, pendingDictionary);
        pendingDictionary.setTypeCode(dataDictionaryCO.getType_code());
        pendingDictionary.setTypeName(dataDictionaryCO.getType_name());
        pendingDictionary.setItemKey(dataDictionaryCO.getItem_key());
        pendingDictionary.setItemValue(dataDictionaryCO.getItem_value());
        return pendingDictionary;
    }

    @Override
    public void update(DataDictionaryCO before, DataDictionaryCO after) {

        String ddkey = DDKEY_PREFIX + after.getType_code();

        // 先查询redis中是否存在该数据字典list
        String ddListStr = redis.get(ddkey);
        List<DataDictionary> redisDDList = null;
        if (StringUtils.isBlank(ddListStr)) {
            // 如果不存在,啥都不要干
        } else {
            // 如果redis中存在该list,则直接在缓存的list中修改对应的数据字典项就行,再重置缓存
            redisDDList = GsonUtils.stringToListAnother(ddListStr,
                                                        DataDictionary.class);
            for (DataDictionary dd : redisDDList) {
                if (dd.getId().equalsIgnoreCase(after.getId())) {
                    DataDictionary pendingDictionary = convertDD(after);
                    redisDDList.remove(dd);
                    redisDDList.add(pendingDictionary);
                    break;
                }
            }
            redis.set(ddkey, GsonUtils.object2String(redisDDList));
        }
    }

    @Override
    public void delete(DataDictionaryCO dataDictionary) {
        String ddkey = DDKEY_PREFIX + dataDictionary.getType_code();

        // 先查询redis中是否存在该数据字典list
        String ddListStr = redis.get(ddkey);
        List<DataDictionary> redisDDList = null;
        if (StringUtils.isBlank(ddListStr)) {
            // 如果不存在,啥都不要干
        } else {
            // 如果redis中存在该list,则直接在缓存的list中删除该数据字典项就行,再重置缓存
            redisDDList = GsonUtils.stringToListAnother(ddListStr,
                                                        DataDictionary.class);
            for (DataDictionary dd : redisDDList) {
                if (dd.getId().equalsIgnoreCase(dataDictionary.getId())) {
                    redisDDList.remove(dd);
                    break;
                }
            }
            redis.set(ddkey, GsonUtils.object2String(redisDDList));
        }
    }

}

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

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

相关文章

冰冰学习笔记:简单了解protobuf

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

Fiddler(Statistics、Inspectors)详解

一、Fiddler Statistics详解 Fiddler的 Statistics 分页会统计请求和响应的一些信息。可以使用它完成简单的性能测试&#xff0c;查看其接口的响应时间。 如果你想学习Fiddler抓包工具&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的Fiddle…

Java 网络编程 —— RMI 框架

概述 RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架&#xff0c;采用客户/服务器通信方式&#xff0c;在服务器上部署了提供各种服务的远程对象&#xff0c;客户端请求访问服务器上远程对象的方法&#xff0c;它要求客户端与服务器端都是 Java 程序 RMI 框架采用代…

提升安全性与合规性的关键工具ADAudit Plus

在当今数字化时代&#xff0c;企业对于安全性和合规性的要求越来越高。特别是在Active Directory&#xff08;AD&#xff09;域中&#xff0c;作为组织的核心身份验证和访问管理系统&#xff0c;审计活动的重要性变得前所未有。为了满足这一需求&#xff0c;ADAudit Plus成为了…

TwinCAT3 安装和打开项目问题记录

安装的VS版本: cn_visual_studio_professional_2015_with_update_3_x86_x64_dvd_8923256.iso 安装的TwinCAT版本: TC31-FULL-Setup.3.1.4024.29 更多的TwinCAT版本我都放在了百度云盘,有需求可以留言 4022.22 链接:https://pan.baidu.com/s/1D505FdgL7l1DAUANKb-VLg 提取…

【C++】入门基础知识详解(一)

目录 一、C关键字 二、命名空间 1、命名空间的定义 2、命名空间的使用 三、C输入&&输出 四、缺省参数 1、缺省参数的概念 2、缺省参数的分类 2.1 全缺省参数 2.2 半缺省参数 一、C关键字 我们在学习C之前&#xff0c;我相信大家大多数都对C语言多多少少都有所了解…

JMeter之__threadNum妙用:将接口查询结果列表按顺序赋值给各线程

使用JMeter做性能测试会遇到这么一个场景&#xff1a;后面的请求需要根据前面的查询列表结果通过正则表达式提取器取值后赋值&#xff0c;而后面用户的赋值必须是唯一的&#xff0c;此时该如何做&#xff1f; 如果按编程思维来说&#xff0c;这个问题并不难。只需要把前面的结…

Azkaban搭建与使用

下载最新azkaban源文件&#xff1a;https://github.com/azkaban/azkaban/releases 集群模式安装 1.解压 azkaban-db-3.84.4.tar.gz、 azkaban-exec-server-3.84.4.tar.gz 和 azkaban-web-server-3.84.4.tar.gz 到/opt/install/azkaban 目录下 linux>tar -zxvf azkaban-db-3…

算法:静态查找表

查找表&#xff08;Search table&#xff09;是由同一类型的数据元素&#xff08;或记录&#xff09;构成的集合。关键字(key)是数据元素中某个数据项的值&#xff0c;又称为键值&#xff0c;用它可以表示一个数据元素&#xff0c;也可以标识一个记录的数据项&#xff08;字段&…

当深度学习撞上高性能计算,科研仿佛坐上了加速器

今天深度学习无处不在&#xff0c;当你打开移动终端的时候&#xff0c;各种APP会推荐到你喜欢的食物、你喜欢的电影&#xff0c;你关注的新闻热点。在生活中更是改变着我们&#xff0c;今天的智能语音让语言障碍破除&#xff0c;在预测疾病基因大数据领域预测疾病来确定药物治疗…

2023年大学生就业怎么样?双一流高校就业率仅15%,到底是咋了?

2023年&#xff0c;大学毕业生就业状况如何&#xff0c;一直是社会关注的焦点。尤其是中国的双一流高校&#xff0c;以其优越的教学与研究背景和实力&#xff0c;被众多年轻人视为就业的理想选择。 然而&#xff0c;在最新的统计数据中&#xff0c;这些一流高校的就业率却惊人…

欧科云链OKLink全新推出Onchain AML服务 助力新金融合规健康发展

据香港大公报报道&#xff0c;为期两天的全球高端经济峰会2023格林威治经济论坛(GreenwichEconomicForum&#xff0c;下称GEF论坛)于6月15日在香港交易所举办&#xff0c;欧科云链控股有限公司&#xff08;下称“欧科云链”&#xff0c;股票代码&#xff1a;01499.HK&#xff0…

【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week4

北邮国院大三电商在读&#xff0c;随课程进行整理知识点。仅整理PPT中相对重要的知识点&#xff0c;内容驳杂并不做期末突击复习用。个人认为相对不重要的细小的知识点不列在其中。如有错误请指出。转载请注明出处&#xff0c;祝您学习愉快。 如需要pdf格式的文件请私信联系或…

VALSE 2023 无锡线下参会个人总结 6月12日-3

VALSE2023 无锡线下参会个人总结 6月12日-3 6月12日会议日程安排Workshop&#xff1a;多模态大模型与提示学习左旺孟&#xff1a;预训练模型和语言增强的零样本视觉学习余宙&#xff1a;知识增强的多模态预训练和提示学习王云鹤&#xff1a;多模态交织&#xff1a;高效模型架构…

STM32中断设置以及中断优先级设置-不含代码例程

本项目使用到的是STM32F030C8型号的MCU&#xff0c;我们可以从官方下载到的标准库文件中的启动汇编文件中&#xff0c;查看到本型号单片机的外部中断向量表。&#xff08;如下图所示&#xff09; 首先&#xff0c;我们了解一下NVIC是什么&#xff0c;在core_cm0.h文件中的标准库…

海川润泽“巧克力”DTU强势来袭

1、设备介绍 “巧克力”DTU(型号&#xff1a;HCRZ-DTU200)&#xff0c;它可以实现远程通信、安全传输等功能&#xff0c;提高了传输的效率和可靠性。采用全新工业级设计&#xff0c;灵活应用于不同场景。此款DTU体积小(76mm31mm21.8mm)、重量轻(150g)&#xff0c;安装简便&…

「任务派发」上线,高效管理跨平台营销任务

作为企业矩阵号相关业务的负责人&#xff0c;您在工作中是否遇到&#xff1a; 下达一个营销任务&#xff0c;需要在几十上百个群里沟通对接&#xff1f;任务发布后&#xff0c;无法掌握各运营者执行情况&#xff1f;账号数据难回收&#xff0c;无法检验任务完成效果&#xff1…

阿里云携手开放原子开源基金会倡议发起云原生工作委员会,两大开源项目达成捐赠意向

6月11日&#xff0c;2023开放原子全球开源峰会正式拉开帷幕。本届峰会以“开源赋能&#xff0c;普惠未来”为主题&#xff0c;设置了开幕式暨高峰论坛、20余场分论坛和开源成果及重点项目展览。在峰会主论坛&#xff0c;开放原子开源基金会理事长孙文龙协各家单位共同倡议发起云…

抖音加码自营电商,拿什么做出差异化?

今年618期间&#xff0c;抖音电商可谓是花尽了心思。不仅推出了补贴活动&#xff0c;上架了单品超值购、商城频道主题日、搜索彩蛋等玩法&#xff0c;而且在售后方面&#xff0c;还推出了“安心购”服务&#xff0c;可提供“七天无理由退货”“极速退款”“运费险”“过敏包退”…

关于QTreeView使用自定义Tree Model时,插入子项目时,扩展箭头不显示的问题

在使用自定义的TreeModel显示数据时&#xff0c;添加子项目后&#xff0c;扩展箭头不显示&#xff0c;但是点击原来扩展箭头在的地方时&#xff0c;树仍能够展开添加的子项目。 经过研究发现&#xff0c;QTreeView有以下代码&#xff1a; 说明如果调用的beginInserRows中的par…