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数据同步了