目錄
一、開(kāi)啟binlog日志
1.首先查看是否開(kāi)啟了binlog
2、開(kāi)啟binlog日志,并重啟mysql服務(wù)
二、授權(quán) canal 鏈接 MySQL 賬號(hào)具有作為 MySQL slave 的權(quán)限
三、下載配置canal
1、下載 canal, 訪問(wèn)?release?頁(yè)面 , 選擇需要的包下載, 如以 1.0.17 版本為例
2、?修改conf\example文件夾下instance.properties配置文件
3、啟動(dòng)canal服務(wù)(windows下是bat,linux是sh)
四、基于Canal通知原理
五、項(xiàng)目集成
1、pom依賴
2、編寫依賴
3、修改Item實(shí)體類
4、編寫監(jiān)聽(tīng)器(Redis/ jvm緩存同步)?
六、測(cè)試
1、數(shù)據(jù)庫(kù)表數(shù)據(jù)和redis數(shù)據(jù)
2、添加數(shù)據(jù)
3、修改數(shù)據(jù)
?編輯4、刪除數(shù)據(jù)
一、開(kāi)啟binlog日志
1.首先查看是否開(kāi)啟了binlog
show variables like '%log_bin%';
如果是OFF說(shuō)明位開(kāi)啟
2、開(kāi)啟binlog日志,并重啟mysql服務(wù)
右鍵我的電腦——管理——服務(wù)——MYSQL——屬性
這里是my.ini地址
在[mysqld]底下添加
log-bin= mysqlbinlog
binlog-format=ROW
配置好之后,要進(jìn)行重啟mysql服務(wù)
查看狀態(tài)?
show variables like '%log_bin%';
開(kāi)啟成功?
二、授權(quán) canal 鏈接 MySQL 賬號(hào)具有作為 MySQL slave 的權(quán)限
CREATE USER canal IDENTIFIED BY 'canal'; ?
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
三、下載配置canal
1、下載 canal, 訪問(wèn)?release?頁(yè)面 , 選擇需要的包下載, 如以 1.0.17 版本為例
或者使用我的文件:阿里云盤分享
解壓后
2、?修改conf\example文件夾下instance.properties配置文件
最終配置文件
#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0
# enable gtid use true/false
canal.instance.gtidon=false
# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=
# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=msir1234
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# table regex
canal.instance.filter.regex=.*\\..*
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# mq config
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.enableDynamicQueuePartition=false
#canal.mq.partitionsNum=3
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#################################################
3、啟動(dòng)canal服務(wù)(windows下是bat,linux是sh)
?點(diǎn)擊startup.bat啟動(dòng)
查看日志?logs\canal\canal.log,如果啟動(dòng)成功則如下圖
四、基于Canal通知原理
解讀:
- 商品服務(wù)完成商品修改后,業(yè)務(wù)直接結(jié)束,沒(méi)有任何代碼侵入
- Canal監(jiān)聽(tīng)MySQL數(shù)據(jù)庫(kù)的變化,當(dāng)發(fā)現(xiàn)變化后,立即通知緩存服務(wù)。
- 緩存服務(wù)接收到canal通知,更新緩存
五、項(xiàng)目集成
1、pom依賴
使用GitHub上的第三方開(kāi)源的canal-starter客戶端。地址:https://github.com/NormanGyllenhaal/canal-client
<dependency>
????????<groupId>top.javatool</groupId>
????????<artifactId>canal-spring-boot-starter</artifactId>
????????<version>1.2.1-RELEASE</version>
</dependency>
2、編寫依賴
canal:
? ?destination: example
? ?server: localhost:11111? ? ? ? #canal的ip地址和端口
3、修改Item實(shí)體類
Canal推送給canal-client的是被修改的這一行數(shù)據(jù)(row),而我們引入的canal-client則會(huì)幫我們把行數(shù)據(jù)封裝到Item實(shí)體類中。這個(gè)過(guò)程需要知道數(shù)據(jù)庫(kù)與實(shí)體的映射關(guān)系。需要用到JPA的注解:
通過(guò)@Id、@Column等注解完成Item與數(shù)據(jù)庫(kù)表字段的映射:
注意,如果和數(shù)據(jù)庫(kù)名稱不同必須用@Column
package com.springboot3.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
/**
*
* @TableName course
*/
@TableName(value ="course")
@Data
public class Course implements Serializable {
/**
*
*/
@Id
@TableId
private String id;
/**
*
*/
private String name;
/**
*
*/
@Column(name = "teacher_id")
private String teacherId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
4、編寫監(jiān)聽(tīng)器(Redis/ jvm緩存同步)?
通過(guò)實(shí)現(xiàn)EntryHandler<T>
接口編寫監(jiān)聽(tīng)器,監(jiān)聽(tīng)Canal消息。注意兩點(diǎn):
- 實(shí)現(xiàn)類通過(guò)
@CanalTable("course")
指定監(jiān)聽(tīng)的表信息。 - EntryHandler的泛型是與表對(duì)應(yīng)的實(shí)體類
package com.springboot3.handler;
import com.springboot3.domain.Course;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;
@CanalTable(value = "Course")
@Component
@Slf4j
public class CourseHandler implements EntryHandler<Course> {
@Autowired
private RedisTemplate redisTemplate;
@Override
public void insert(Course course) {
log.info("insert message {}", course);
redisTemplate.opsForValue().set(course.getId(),course);
}
@Override
public void update(Course before, Course after) {
log.info("update before {} ", before);
log.info("update after {}", after);
redisTemplate.opsForValue().set(after.getId(),after);
}
@Override
public void delete(Course course) {
log.info("delete {}", course);
redisTemplate.delete(course.getId());
}
}
六、測(cè)試
1、數(shù)據(jù)庫(kù)表數(shù)據(jù)和redis數(shù)據(jù)
數(shù)據(jù)庫(kù):
redis:
2、添加數(shù)據(jù)
添加數(shù)據(jù)物理
控制臺(tái)顯示:
redis數(shù)據(jù)庫(kù):
3、修改數(shù)據(jù)
將物理修改為化學(xué)
控制臺(tái)顯示:
redis數(shù)據(jù)庫(kù):
4、刪除數(shù)據(jù)
刪除化學(xué)科目
控制臺(tái)數(shù)據(jù)
?redis數(shù)據(jù)庫(kù)數(shù)據(jù):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-649413.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-649413.html
到了這里,關(guān)于mysql使用redis+canal實(shí)現(xiàn)緩存一致性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!