什么网站做博客好,如何做表白网站的教程,网站建设在未来的发展趋势,网站开分站一、开启binlog日志
1.首先查看是否开启了binlog show variables like %log_bin%; 如果是OFF说明位开启
2、开启binlog日志#xff0c;并重启mysql服务
右键我的电脑——管理——服务——MYSQL——属性 这里是my.ini地址
在[mysqld]底下添加 log-bin mysqlbinlog binlog-f…一、开启binlog日志
1.首先查看是否开启了binlog show variables like %log_bin%; 如果是OFF说明位开启
2、开启binlog日志并重启mysql服务
右键我的电脑——管理——服务——MYSQL——属性 这里是my.ini地址
在[mysqld]底下添加 log-bin mysqlbinlog binlog-formatROW 配置好之后要进行重启mysql服务
查看状态 show variables like %log_bin%; 开启成功
二、授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限 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, 访问 release 页面 , 选择需要的包下载, 如以 1.0.17 版本为例 解压后 2、 修改conf\example文件夹下instance.properties配置文件 最终配置文件 ################################################# ## mysql serverId , v1.0.26 will autoGen # canal.instance.mysql.slaveId0 # enable gtid use true/false canal.instance.gtidonfalse # position info canal.instance.master.address127.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.enabletrue #canal.instance.tsdb.urljdbc:mysql://127.0.0.1:3306/canal_tsdb #canal.instance.tsdb.dbUsernamecanal #canal.instance.tsdb.dbPasswordcanal #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.dbUsernameroot canal.instance.dbPasswordmsir1234 canal.instance.connectionCharset UTF-8 # enable druid Decrypt database password canal.instance.enableDruidfalse #canal.instance.pwdPublicKeyMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ # table regex canal.instance.filter.regex.*\\..* # table black regex canal.instance.filter.black.regexmysql\\.slave_.* # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2) #canal.instance.filter.fieldtest1.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.fieldtest1.t_product:subject/product_image,test2.t_company:id/name/contact/ch # mq config canal.mq.topicexample # dynamic topic route by schema or table regex #canal.mq.dynamicTopicmytest1.user,topic2:mytest2\\..*,.*\\..* canal.mq.partition0 # hash partition config #canal.mq.enableDynamicQueuePartitionfalse #canal.mq.partitionsNum3 #canal.mq.dynamicTopicPartitionNumtest.*:4,mycanal:6 #canal.mq.partitionHashtest.table:id^name,.*\\..* ################################################# 3、启动canal服务windows下是batlinux是sh 点击startup.bat启动 查看日志 logs\canal\canal.log如果启动成功则如下图 4、基于Canal通知原理 解读
商品服务完成商品修改后业务直接结束没有任何代码侵入Canal监听MySQL数据库的变化当发现变化后立即通知缓存服务。缓存服务接收到canal通知更新缓存
5、项目集成
5.1、pom依赖
使用GitHub上的第三方开源的canal-starter客户端。地址https://github.com/NormanGyllenhaal/canal-client dependency groupIdtop.javatool/groupId artifactIdcanal-spring-boot-starter/artifactId version1.2.1-RELEASE/version /dependency 5.2、编写依赖 canal: destination: heima # canal的集群名字要与安装canal时设置的名称一致 server: 192.168.150.101:11111 # canal服务地址 5.3、修改Item实体类
Canal推送给canal-client的是被修改的这一行数据row而我们引入的canal-client则会帮我们把行数据封装到Item实体类中。这个过程需要知道数据库与实体的映射关系。需要用到JPA的注解
通过Id、Column、等注解完成Item与数据库表字段的映射
package com.heima.item.pojo;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 lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;import javax.persistence.Column;
import java.util.Date;Data
TableName(tb_item)
public class Item {TableId(type IdType.AUTO)Idprivate Long id;//商品idColumn(name name)private String name;//商品名称private String title;//商品标题private Long price;//价格分private String image;//商品图片private String category;//分类名称private String brand;//品牌名称private String spec;//规格private Integer status;//商品状态 1-正常2-下架private Date createTime;//创建时间private Date updateTime;//更新时间TableField(exist false)Transientprivate Integer stock;TableField(exist false)Transientprivate Integer sold;
}5.4、编写监听器Redis/ jvm缓存同步
通过实现EntryHandlerT接口编写监听器监听Canal消息。注意两点
实现类通过CanalTable(tb_item)指定监听的表信息。EntryHandler的泛型是与表对应的实体类
package com.heima.item.canal;import com.github.benmanes.caffeine.cache.Cache;
import com.heima.item.config.RedisHandler;
import com.heima.item.pojo.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;CanalTable(tb_item)
Component
public class ItemHandler implements EntryHandlerItem {
// 表中数据发生变化时就会把变化的那一行数据封装成Item实体传递到下面的三个方法Autowiredprivate RedisHandler redisHandler;Autowiredprivate CacheLong, Item itemCache;Overridepublic void insert(Item item) {// 写数据到JVM进程缓存itemCache.put(item.getId(), item);// 写数据到redisredisHandler.saveItem(item);}Overridepublic void update(Item before, Item after) {// 写数据到JVM进程缓存itemCache.put(after.getId(), after);// 写数据到redisredisHandler.saveItem(after);}Overridepublic void delete(Item item) {// 删除数据到JVM进程缓存itemCache.invalidate(item.getId());// 删除数据到redisredisHandler.deleteItemById(item.getId());}
}在这里对Redis的操作都封装到了RedisHandler这个对象中是我们之前做缓存预热时编写的一个类内容如下
package com.heima.item.config;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.heima.item.pojo.Item;
import com.heima.item.pojo.ItemStock;
import com.heima.item.service.IItemService;
import com.heima.item.service.IItemStockService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.util.List;Component
public class RedisHandler implements InitializingBean {Autowiredprivate StringRedisTemplate redisTemplate;Autowiredprivate IItemService itemService;Autowiredprivate IItemStockService stockService;private static final ObjectMapper MAPPER new ObjectMapper();Overridepublic void afterPropertiesSet() throws Exception {// 初始化缓存// 1.查询商品信息ListItem itemList itemService.list();// 2.放入缓存for (Item item : itemList) {// 2.1.item序列化为JSONString json MAPPER.writeValueAsString(item);// 2.2.存入redisredisTemplate.opsForValue().set(item:id: item.getId(), json);}// 3.查询商品库存信息ListItemStock stockList stockService.list();// 4.放入缓存for (ItemStock stock : stockList) {// 2.1.item序列化为JSONString json MAPPER.writeValueAsString(stock);// 2.2.存入redisredisTemplate.opsForValue().set(item:stock:id: stock.getId(), json);}}public void saveItem(Item item) {try {String json MAPPER.writeValueAsString(item);redisTemplate.opsForValue().set(item:id: item.getId(), json);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}public void deleteItemById(Long id) {redisTemplate.delete(item:id: id);}
}5.5、测试
查看控制台说明java以及和canal建立了连接。
当修改了数据库的内容后reids和Tomcat缓存都会发生变化。