1.首先mysql数据库得开启binlog

(这里不演示如何开启binlog,只演示如何用Canal实现Mysql Redis数据同步)

2.导入canal依赖

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

3.application.yml配置设置连接

#canal配置信息

canal: 
  destination: example  
  server: 121.77.14.222:11111 #连接地址

4.在要监听的表的实体类上加上注解 

package com.sks.product.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Builder;
import lombok.Data;
import org.springframework.data.annotation.Id;

import javax.persistence.Column;
import java.io.Serializable;
import java.util.Date;

import static com.baomidou.mybatisplus.annotation.IdType.INPUT;


/**
 * 演示如何加注解实体类
 *
 * @author common
 * @date 2022/04/17
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("sks_product_info")
public class ProductInfoEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 1.必须加上@Id,要不然canal监控不到表
     */

   
    @Id
    @TableId()
    private Long id;
    /**
     * 2.实体类字段名与数据库字段名不一致 ,需要加上@Column(name = "")注解
     */
    @Column(name = "product_name")
    private String productName;


    /**
     * 2.实体类字段名与数据库字段名不一致 ,需要加上@Column(name = "")注解
     */
    @Column(name = "classify_id")
    private Long classifyId;
   


    private Integer state;

   

    private Integer acura;


    /**
     * 2.实体类字段名与数据库字段名不一致 ,需要加上@Column(name = "")注解
     */
    @Column(name = "view_image")
    private String viewImage;
   

     /**
     * 2.实体类字段名与数据库字段名不一致 ,需要加上@Column(name = "")注解
     */
    @Column(name = "default_spec_id")
    private Long defaultSpecId;

 
}

5.复写 EntryHandler<需要监听实体类> 接口  得到三个方法 insert() update() delete() 

package com.sks.product.canal;

import com.sks.commons.util.RedisUtil;
import com.sks.product.config.RedisConfig;
import com.sks.product.entity.ProductCarouselEntity;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

/**
 * 1.首先加上 @CanalTable("需要监控的表名") 注解
 * 2.实现 EntryHandler<需要监控的表对应的实体类> 借口
 * 3.按 alt键+insert键,会得到三个方法 ,分别是 增 ,改 ,删
 * 4.在这三个方法中分别写对应Redis 增,改, 删 方法 ,然后就可以了
 * 5.当你用canal监控的mysql表发生增,改,删事件时,canal会自动同步Redis里面的数据
 *
 * @author common
 * @date 2022/04/27
 */
@CanalTable("sks_product_carousel")
@Component
public class ProductCarouselHandle implements EntryHandler<ProductCarouselEntity> {




    /**
     * 插入
     *
     *
     * 只要canal监控的mysql表,发生增加操作,就会执行此方法
     * @param productCarouselEntity 演示实体类
     */
    @Override
    public void insert(ProductCarouselEntity productCarouselEntity) {
        //这是我向Redis里面插入数据的方法(你们可以写自己的方法)             

RedisUtil.hSetNotExist(RedisConfig.PRODUCT_CAROUSEL.getMsg(),productCarouselEntity.getId(),productCarouselEntity);
    }



    /**
     * 更新
     *
     *
     *只要canal监控的mysql表,发生更新操作,就会执行此方法
     *
     *
     * @param before 之前
     * @param after  后
     */
    @Override
    public void update(ProductCarouselEntity before, ProductCarouselEntity after) {
        //这是我向Redis里面更新数据的方法(你们可以写自己的方法)

RedisUtil.hSetNotExist(RedisConfig.PRODUCT_CAROUSEL.getMsg(),after.getId(),after);
    }



    /**
     * 删除
     *
     *
     *
     *只要canal监控的mysql表,发生删除操作,就会执行此方法
     *
     *
     * @param productCarouselEntity 轮播图实体产品
     */
    @Override
    public void delete(ProductCarouselEntity productCarouselEntity) {
       //这是我向Redis里面删除数据的方法(你们可以写自己的方法)

RedisUtil.hDel(RedisConfig.PRODUCT_CAROUSEL.getMsg(),productCarouselEntity.getId());
    }
}

然后就可以实现Mysql Redis数据同步了

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐