• 缓存同步canal实现(订阅binlog)


    1、基于mq实现缓存同步
    2、基于canal实现缓存同步
    在这里插入图片描述
    2.1 开启Mysql的主从

    2.1.1 修改my.cnf,添加以下两行

    log-bin=/morecache/mysql/mysql-bin
    binlog-do-db=heima
    
    • 1
    • 2

    重启docker,/mysql/data目录下会出现mysql-bin.000001

    2.1.2 添加一个仅用于数据同步的账户

    create user canal@'%' IDENTIFIED by 'canal';
    GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
    FLUSH PRIVILEGES;
    
    • 1
    • 2
    • 3

    查看主库的状态(如果从库字段position小于主库,那么就有新的数据要获取了)

    show master status
    
    • 1

    2.1.3 创建网络,让canal和mysql通信

    docker network create heima
    
    • 1

    2.1.4 启动canal

    docker run -p 11111:11111 --name canal \
    -e canal.destinations=heima \
    -e canal.instance.master.address=mysql:3306  \
    -e canal.instance.dbUsername=canal  \
    -e canal.instance.dbPassword=canal  \
    -e canal.instance.connectionCharset=UTF-8 \
    -e canal.instance.tsdb.enable=true \
    -e canal.instance.gtidon=false  \
    -e canal.instance.filter.regex=heima\\..* \
    --network heima \
    -d canal/canal-server:v1.1.5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当canal监听到binlog发生变化,会通知canal客户端。

    2.1.5 引入依赖

    <dependency>
        <groupId>top.javatool</groupId>
        <artifactId>canal-spring-boot-starter</artifactId>
        <version>1.2.1-RELEASE</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.1.6 编写yml配置

    canal:
      destination: heima # canal的集群名字,要与安装canal时设置的名称一致
      server: 192.168.229.129:11111 # canal服务地址
    
    • 1
    • 2
    • 3

    2.1.7 编写监听canal

    @CanalTable("tb_item") //监听的表
    @Component
    public class ItemHandler implements EntryHandler<Item> {
    
        @Autowired
        private RedisHandler redisHandler;
        @Autowired
        private Cache<Long, Item> itemCache;
    
        @Override
        public void insert(Item item) {
            // 写数据到JVM进程缓存
            itemCache.put(item.getId(), item);
            // 写数据到redis
            redisHandler.saveItem(item);
        }
    
        @Override
        public void update(Item before, Item after) {
            // 写数据到JVM进程缓存
            itemCache.put(after.getId(), after);
            // 写数据到redis
            redisHandler.saveItem(after);
        }
    
        @Override
        public void delete(Item item) {
            // 删除数据到JVM进程缓存
            itemCache.invalidate(item.getId());
            // 删除数据到redis
            redisHandler.deleteItemById(item.getId());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.1.8 实体类

    对于实体类,Canal会将改变的数据注入Item,如果属性名和数据库字段名不一致,需要用注解标明

    @Data
    @TableName("tb_item")
    public class Item {
        @TableId(type = IdType.AUTO)
        @Id
        private Long id;//商品id
        @Column(name = "name")
        private String name;//商品名称
        private String title;//商品标题
        private Long price;//价格(分)
        private String image;//商品图片
        private String category;//分类名称
        private String brand;//品牌名称
        private String spec;//规格
        private Integer status;//商品状态 1-正常,2-下架
        private Date createTime;//创建时间
        private Date updateTime;//更新时间
        @TableField(exist = false)
        @Transient//不属于表内的字段
        private Integer stock;
        @TableField(exist = false)
        @Transient
        private Integer sold;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    新零售六大模式,你学会了吗?
    【腾讯云Cloud Studio实战训练营】戏说cloud studio
    TechTool Pro for mac中文激活版:硬件监测和系统维护工具
    Java疫苗预约小程序线上疫苗预约系统
    《Go语言实战》-第一章 介绍及入门
    电商通用(四)
    Microsoft VBA Excel 提取相同名称的整列数据
    【云原生之kubernetes实战】在k8s环境下部署Discuz论坛系统
    【RocketMQ】主从同步实现原理
    GEE:绘制土地利用类型面积分布柱状图
  • 原文地址:https://blog.csdn.net/qq_46624276/article/details/126666303