通过本文章,可以完成多级缓存架构中的缓存同步。


一、Canal服务

1. mysql添加canal用户
连接在上一次multiCache
项目中运行的mysql
容器,创建canal
用户。
1 | CREATE USER canal IDENTIFIED BY 'canal'; |
2. mysql配置文件
在docker/mysql/conf/my.cnf
添加如下配置
1 | server-id=1000 |
3. canal配置文件
添加canal
服务块到docker-compose.yml
,如下
1 | canal: |
1 | docker pull canal/canal-server:v1.1.7 |
任意启动一个canal-server
容器,将里面的/home/admin/canal-server/conf
文件夹复制到宿主机,对应docker/canal/conf
文件夹。
删除此临时容器。
修改docker/canal/conf/canal.properties
如下条目
1 | canal.destinations=example |
修改docker/canal/conf/example/instance.properties
如下条目
1 | canal.instance.master.address=172.30.3.2:3306 |
二、引入依赖
pom.xml
1 | <dependency> |
application.yml
1 | canal: |
三、监听Canal消息
这是canal-spring-boot-starter
官方仓库,含使用文档
新建canal.ItemHandler
类,内容如下
1 | package com.heima.item.canal; |
修改pojo.Item
类,如下
1 | package com.heima.item.pojo; |
四、运行
到此为止,docker-compose.yml
内容应该如下
1 | version: '3.8' |
删除原来的multiCache
,重新启动各项服务。
1 | docker-compose -p multi-cache up -d |
启动springboot
程序。

五、测试
springboot
不断输入类似如下日志,属于正常监听canal
消息中。
1 | 09:27:17:175 INFO 1 --- [l-client-thread] t.j.c.client.client.AbstractCanalClient : 获取消息 Message[id=-1,entries=[],raw=false,rawEntries=[]] |
访问http://localhost:8081/item/10001
,此时信息为tomcat
查询数据库所得数据,而后存入Caffeine
缓存。
访问http://localhost:8080/item.html?id=10001
,此时信息为Redis
缓存数据。
然后,
访问http://localhost:8081/
来到商品管理页面。

修改id=10001的数据的商品分类

确认后
springboot日志出现类似如下日志
1 | 09:31:29:234 INFO 1 --- [l-client-thread] t.j.c.client.client.AbstractCanalClient : 获取消息 Message[id=1,entries=[header { |
这里可以先用redis
连接工具查询数据,发现rediis
已被更新。

再次访问http://localhost:8081/item/10001
直接向springboot
的controller
发送请求,发现caffeine
数据更新,并且springboot
日志没有出现查询记录,说明走的是caffeine
。
