【Redis】多级缓存之缓存数据同步策略与Canal

29 篇文章 2 订阅

目录

一、数据同步策略

1.设置有效期

2.同步双写

3.异步通知

二、Canal

三、监听Canal


一、数据同步策略

缓存数据同步的常见方式有三种:

1.设置有效期

给缓存设置有效期,到期后自动删除。再次查询时更新,他简单、方便,但是时效性差,缓存过期之前可能不一致,适用于更新频率较低,时效性要求低的业务

2.同步双写

在修改数据库的同时修改缓存,他时效性强,缓存与数据库一致性强但是有代码侵入,耦合度高,适用于对一致性、时效性要求较高的缓存任务

3.异步通知

修改数据库时发送事件通知,,相关的服务监听到后修改缓存数据,这种方式耦合度低,可同时通知多个缓存服务,但是时效性一般,存在中间不一致状态,适用于时效性要求一般,有多个服务需要同步

二、Canal

Canal是阿里巴巴旗下的一款开源的项目,基于Java开发,他基于数据库增量日志的解析,提供增量数据的订阅与消费。Canal是基于MySQL的主从同步实现的,MySQL的主从同步原理如下:主节点会将变更的数据写入二进制日志文件,而从节点会将主节点的二进制日志文件拷贝到他的中继日志,然后重放日志里的事件将数据的变更进行同步,Canal就是将之间伪装成一个MySQL的从节点,从而监听主节点日志的变化,再将变更的信息通知给客户端,完成数据同步

 

三、监听Canal

Canal支持多种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。我们这里使用Github开源的canal-starter

首先我们需要引入依赖

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

然后在配置文件中进行配置

canal:

        destination:canal实例的名称

        server:canal的地址 

最后在代码中编写监听器,监听Canal消息 

@CanalTable("监听的数据库表名")
@Component
public class Handler implements EntryHandler<数据库表对应的实体类>{
    // 重写 insert、update、delete方法,在这三个方法里写更新缓存的操作
}

在Canal中推送给客户端的是被修改的这一行的数据,我们的Java客户端的监听器会将这一行数据封装为对应的Java对象,但是在这个过程中我们需要直到实体类与数据库字段的映射关系,这就需要我们在实体类中加对应的注解

@Id 用于标明表中的id字段

@Column(name="数据库字段名")用于表面这个成员变量对应数据中的哪一个字段

@Transient 用于表明这个成员变量不是表中的字段

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1886i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值