微服务框架 SpringCloud微服务架构 多级缓存 49 缓存同步 49.3 监听Canal

news2024/11/25 14:38:09

微服务框架

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

多级缓存

文章目录

      • 微服务框架
      • 多级缓存
      • 49 缓存同步
        • 49.3 监听Canal
          • 49.3.1 Canal 客户端

49 缓存同步

49.3 监听Canal

49.3.1 Canal 客户端

Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。

在这里插入图片描述

Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。不过这里我们会使用GitHub上的第三方开源的canal-starter。

地址:https://github.com/NormanGyllenhaal/canal-client

在这里插入图片描述

好家伙,纯Java 编写

引入依赖:

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

在这里插入图片描述

OK

编写配置:

canal:
  destination: heima
  server: 1.13.92.88:11111

在这里插入图片描述

OK

【编写监听器】

在这里插入图片描述

Canal推送给canal-client的是被修改的这一行数据(row),而我们引入的canal-client则会帮我们把行数据封装到Item实体类中。

这个过程中需要知道数据库与实体的映射关系,要用到JPA的几个注解:

在这里插入图片描述

修改实体类

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 java.util.Date;

@Data
@TableName("tb_item")
public class Item {
    @TableId(type = IdType.AUTO)
    @Id
    private Long id;//商品id
    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)
    @Transient
    private Integer stock;
    @TableField(exist = false)
    @Transient
    private Integer sold;
}

修改RedisHandler,定义方法

// 新增
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);
    
}

在这里插入图片描述

编写handler

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;

/**
 * ClassName: ItemHandler
 * date: 2022/11/8 20:51
 *
 * @author DingJiaxiong
 */

@CanalTable("tb_item")
@Component
public class ItemHandler implements EntryHandler<Item> {

    @Autowired
    private RedisHandler redisHandler;

    @Autowired
    private Cache<Long, Item> itemCache;

    @Override
    public void insert(Item item) {
        //写数据到JVM 进程缓存
        itemCache.put(item.getId(), item);
        //写数据到Redis
        redisHandler.saveItem(item);

    }

    @Override
    public void update(Item before, Item after) {

        //写数据到JVM 进程缓存
        itemCache.put(after.getId(), after);
        //写数据到Redis
        redisHandler.saveItem(after);

    }

    @Override
    public void delete(Item item) {
        //删除数据到JVM 进程缓存
        itemCache.invalidate(item.getId());
        //删除数据到Redis
        redisHandler.deleteItemById(item.getId());
    }
}

OK

重启服务

在这里插入图片描述

可以看到,它一直在和Canal 建立连接

OK, 我先把它打包 到服务器上跑起来先

在这里插入图片描述

OK

在这里插入图片描述

它也是一直在输出日志

在这里插入图片描述

开个端口

在这里插入图片描述

好家伙,我说怎么没数据,这写死 了 …

在这里插入图片描述

OK

拿到了,服务器上就要分别打两个包 了

就在本地操作吧,修改第一个商品的信息

在这里插入图片描述

直接确定

在这里插入图片描述

更新成功

查看IDEA 控制台日志

在这里插入图片描述

而且现在我再直接让 它去缓存拿,没问题

在这里插入图片描述

其实这儿逻辑有点问题,笔者还没有将项目部署好

在这里插入图片描述

后面弄好了

在这里插入图片描述

直接确定,

查看Redis 数据

在这里插入图片描述

没有一点毛病。就是请求地址写死了 不太好

在这里插入图片描述

OK,Redis 确实已经改了

刚刚不明显,我再来一个

在这里插入图片描述

我直接改成200 寸

在这里插入图片描述

直接查看Redis 缓存

在这里插入图片描述

非常明显,OK这就是缓存同步的 实现【但是吧,这样好像并没有改Nginx的本地缓存,虽然它会自己去拿】

【多级缓存总结】

在这里插入图片描述

OK,多级缓存就这样吧【黑马牛逼!!!!!!!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深耕无线通讯细分领域 可信华成产品受市场青睐

深圳市可信华成通信科技有限公司&#xff08;以下简称可信华成&#xff09;&#xff0c;成立于2010年&#xff0c;是一家在无线通信领域中崛起的集研发、智能制造、销售为一体的国家高新技术企业&#xff0c;深圳市专精特新企业&#xff1b; 注册资金2200万元&#xff0c;员工8…

【图像压缩】余弦变换及霍夫曼编码jpeg压缩和解压【含Matlab源码 2086期】

⛄一、DCT图像无损压缩简介 1 图像压缩 图像压缩按照压缩过程中是否有信息的损失以及解压后与原始图像是否有误差可以分为无损压缩和有损压缩两大类。无损压缩是指不损失图像质量的压缩&#xff0c;它是对文件的存储方式进行优化&#xff0c;采用某种算法表示重复的数据信息&a…

网络安全——【收藏】网络设备安全加固规范

一、Cisco网络设备安全基线规范 本建议用于Cisco路由器和基于Cisco IOS的交换机及其三层处理模块&#xff0c;其软件版本为CISCO IOS 12.0及以上版本。加固前应该先备份系统配置文件。 01 账号管理、认证授权 1.1.本机认证和授权 初始模式下&#xff0c;设备内一般建有没有…

Linux——用户、组的管理以及文件的权限设置

一、用户和组 Linux系统中的用户唯一的标识码为用户ID&#xff0c;即UID&#xff0c;每个用户至少属于一个组&#xff0c;即为用户分组。用户分组存在唯一的标识码&#xff0c;为GID。不同的用户拥有不同的权限。 1&#xff0e;认识用户账号文件/etc/passwd和用户影子文件/et…

Java项目:SSM汽车租车管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员、普通用户两种角色&#xff1b; 管理员主要功能包括&#xff1a; 后台首页、停车位信息管理、车辆求租信息审核、车辆出租信息…

热门技术中的应用:容器技术中的网络-第31讲-容器网络之Calico:为高效说出善意的谎言

上一节我们讲了Flannel如何解决容器跨主机互通的问题,这个解决方式其实和虚拟机的网络互通模式是差不多的,都是通过隧道。但是Flannel有一个非常好的模式,就是给不同的物理机设置不同网段,这一点和虚拟机的Overlay的模式完全不一样。 在虚拟机的场景下,整个网段在所有的物…

操作系统(3)银行家算法模拟实现

参考博客&#xff1a;银行家算法详解&#xff08;C语言&#xff09;_Sparky*的博客-CSDN博客_银行家问题c语言 1. 效果展示 2. 程序流程图 3. 数据结构设计 /**定义数据结构*/ vector<vector<int>> Max;// 最大需求矩阵 vector<vector<int>> Allocat…

小白如何入门Python爬虫?这是我见过最详细的入门教学

本文针对初学者&#xff0c;我会用最简单的案例告诉你如何入门python爬虫&#xff01; 想要入门Python 爬虫首先需要解决四个问题 熟悉python编程 了解HTML 了解网络爬虫的基本原理 学习使用python爬虫库 01了解什么是爬虫&#xff0c;它的基本流程是什么&#xff1f; 网络…

IDEA 2022 之 Lombok 使用 教程

文章目录**1.Lombok是什么****1.1 Lombok 是什么&#xff1f;****Lombok 引入**2、POM 中引入依赖3、IDE 中安装插件**4. Lombok 使用****4.1 Lombok 使用注意**5.代码案例&#xff1a;**Lombok 原理**6. 常用注解结语1.Lombok是什么 ​ Lombok是使用java编写的一款开源类库。…

【Redis】Redis缓存穿透、缓存雪崩、缓存击穿详解与解决办法(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

Java项目:springboot大学生实习管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本系统的用户可以分为三种&#xff1a;管理员、教师、学生。三种角色登录后会有不同菜单界面&#xff1b; 管理员主要功能&#xff1a; 信息管…

graalvm 拯救生命,速速入手

graalvm 拯救生命&#xff0c;速速入手 标题很夸张&#xff0c;graalvm怎么就拯救生命了&#xff1f;把一个启动5-6秒的项目加速到3秒启动&#xff0c;不就是在拯救生命&#xff0c;拯救发际线吗&#xff1f; 我在上一篇博客"SpringBoot3.0工程建立"末尾启动了工程…

高级网络应用复习——三层热备生成树速端口OSPF实验(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.知识点总结 路由器热备份技术HSRP &#xff08;思科私有 HS…

学web前端开发和学习其他编程语言一样吗?

前言&#xff1a; web前端是编程中门槛较低&#xff0c;较易入门的&#xff0c;对年龄和学历要求也不是特别高&#xff0c;但如果学历过低&#xff0c;年龄比较大&#xff0c;又完全没有基础&#xff0c;会在学习时感到吃力&#xff0c;另外也会因为用人公司对学历和年龄的限制…

电巢:半导体投资锐减库存调整消费者需求疲软,半导体下行周期何时结束?

前言 投行PitchBook的资料显示截止到本月5日&#xff0c;2022 年全球半导体初创企业的风险投资达到 78 亿美元。与去年创纪录的 145 亿美元投资者注入硅公司的资金相比下降了 46%&#xff0c;与 2020年的103 亿美元相比下降了 24%。 高盛&#xff08;Goldman sachs&#xff09;…

【LSTM回归预测】基于灰狼算法优化长短时记忆GWO-LSTM时序时间序列数据预测(含前后对比)附Matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

Mycat(8):分片详解之取模

1 找到conf/schema.xml修改 2 取模的路由规则 和轮询一样&#xff0c;取模有什么好处&#xff0c;有什么坏处&#xff1f; 优点&#xff1a;利用的写的负载均衡效果&#xff0c;写入速度很快 缺点&#xff1a;批量写入&#xff0c;失败后事务的回滚有难度&#xff01;代表写…

Svelte 带来哪些新思想?赶紧学起来!

本文介绍 点赞 关注 收藏 学会了 Svelte 是我用过最爽的框架&#xff0c;就算 Vue 和 React 再强大&#xff0c;生态再好&#xff0c;我还是更喜欢 Svelte&#xff0c;因为它开发起来真的很爽。 其实在很久之前我就注意到 Svelte &#xff0c;但一直没把这个框架放在心上。…

【Python百日进阶-数据分析】Day133 - plotly饼图:px.pie()实例

文章目录四、实例4.1 带有 plotly express 的饼图4.1.1 欧洲大陆的人口4.1.2 带有重复标签的饼图4.1.3 使用 px.pie 设置饼图扇区的颜色4.1.4 对离散颜色使用显式映射4.1.5 自定义使用 px.pie 创建的饼图4.1.13 Dash 中的饼图四、实例 饼图是一种圆形统计图表&#xff0c;它被…

微服务框架 SpringCloud微服务架构 服务异步通讯 50 消息可靠性 50.2 消息持久化

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯50 消息可靠性50.2 消息持久化50.2.1 消息持久化50 消息可靠性 50.2 消息持久化 50.2.1 消息…