目录
一、数据同步策略
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 用于表明这个成员变量不是表中的字段