多级缓存架构 | 黑马Redis高级篇

news2024/11/16 23:41:10

目录

一、多级缓存介绍

1、传统缓存的问题

2、多级缓存方案

二、JVM进程缓存

 1、初始Caffeine

缓存分类

Caffeine入门

2、实现进程缓存

三、Lua脚本

1、初始Lua

 2、Lua语法

数据类型

变量

循环

​编辑

函数

条件控制

四、OpenResty

1、初始OpenResty

2、OpenResty快速入门

修改nginx配置

编写lua文件

3、OpenResty获取请求参数

4、封装Http请求工具

5、向tomcat发http请求

6、对tomcat集群负载均衡

7、Redis缓存预热

8、OpenResty查询Redis

9、Nginx本地缓存

五、缓存同步

1、数据同步策略

2、Canal入门

3、引入Canal

4、Canal客户端


一、多级缓存介绍

1、传统缓存的问题

传统缓存策略一般是请求到tomcat后,先查询redis,如果未命中则查询数据库

请求要先经过tomcat处理,tomcat的性能成为整个系统的瓶颈

2、多级缓存方案

多级缓存就是利用请求处理的每个环节,分别添加缓存,减轻tomcat压力,提升服务器性能:

二、JVM进程缓存

 1、初始Caffeine

缓存分类

我们把缓存分为两类:分布式缓存和进程本地缓存

分布式缓存,例如Redis:

  • 优点:缓存容量更大,可靠性更好,可以在集群间共享
  • 缺点:访问缓存网络开销大
  • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享

进程本地缓存,例如hashMap、GuavaCache

  • 优点:读取本地内存,没有网络开销,速度快
  • 缺点:存储量有限,可靠性低,无法共享
  • 场景:性能要求较高,缓存数据量较小

Caffeine入门

Cafeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。

2、实现进程缓存

创建一个CaffeineConfig配置类

在要使用的地方注入bean

修改业务

三、Lua脚本

我们现在已经完成了nginx反向代理和tomcat的进程缓存

接下来我们要用lua来完成nginx的本地缓存

1、初始Lua

Lua是轻量小巧的脚本语言,用c编写,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能,经常用在游戏开发中

centOS自带了lua,所有不用安装

 2、Lua语法

数据类型

变量

Lua声明变量的时候,不需要指定数据的类型,local表示局部变量的意思

循环

for循环遍历的时候do和end就相当于大括号,in后面是要遍历的对象括号里面是类型

前面是以键值对的方式来遍历的,index数组的话就是索引和value就是值

函数

条件控制

四、OpenResty

1、初始OpenResty

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

先按照好OpenResty然后配置好nginx

2、OpenResty快速入门

修改nginx配置

我们先把自己的接口请求打到nginx反向代理服务器,然发到OpenResty的服务器上

openResty的lua模块是固定的直接复制

编写lua文件

因为是快速入门,我们先用假数据返回固定的

3、OpenResty获取请求参数

 

4、封装Http请求工具

我们可以把请求打到nginx的负载均衡服务器再转发到tomcat

 

我们这个请求是要发两次的,我们要提取出来,方便复用,放到lualib目录下

5、向tomcat发http请求

编写lua脚本

因为中间要用到字符串拼接,json不能实现所有要转成lua语法再拼接然后转化json返回

6、对tomcat集群负载均衡

我们实际上不可能只有一台tomcat肯定是集群,所以我们要配置负载均衡

我们肯定不能每次走不同的,这样会导致进程缓存重复缓存,所以我们经历同一个id的请求打到一个服务器上,我们要用hash运算然后对服务器数量取模

7、Redis缓存预热

冷启动:服务刚刚启动时,redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力

缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,再项目启动时将这些热点数据提前查询并保存redis中

所以在我们redisconfig里面添加上预热

因为我们是分表的商品信息表和库存表,所以分开缓存,库存表经常变动

8、OpenResty查询Redis

OpenResty的Redis模块

OpenResty提供了操作Redis的模块,我们只需要引入该模块就能直接使用:

 查询数据的方法

把查询和释放的方法都写到common.lua里面,然后暴露出去,到时候调用就行

查询逻辑也要改,先查询redis,redis没命中再查tomcat

9、Nginx本地缓存

OpenResty为Nginx提供了shard dIct功能,可以在nginx的多个worker之间共享数据,实现缓存功能

先再nginx.conf中配置共享词典

然后导入

需求

  • 修改item,lua中的read data函数,优先查询本地缓存,未命中时再查询Redis、Tomcat
  • 查询Redis或Tomcat成功后,将数据写入本地缓存,并设置有效期
  • 商品基本信息,有效期30分钟(基本上常年不变的可以缓存久点)
  • 库存信息,有效期1分钟(要检测变动的)

五、缓存同步

1、数据同步策略

缓存数据同步的常见方式有三种:

  • 设置有效期:给缓存设置有效期,到期后自动删除。再次查询时更新
    • 优势:简单、方便
    • 缺点:时效性差,缓存过期之前可能不一致
    • 场景:更新频率较低,时效性要求低的业务
  • 同步双写:在修改数据库的同时,直接修改缓存
    • 优势:时效性强,缓存与数据库强一致
    • 缺点:有代码侵入,耦合度高;
    • 场景:对一致性、时效性要求较高的缓存数据
  • 异步通知:修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据
    • 优势:低耦合,可以同时通知多个缓存服务
    • 缺点:时效性一般,可能存在中间不一致状态
    • 场景:时效性要求一般,有多个服务需要同步

 引入canal的异步通知,canal监听数据库的变化,发生变化后立刻通知更新缓存

2、Canal入门

Canal译为水道、管道,是阿里开源项目,基于java开发。基于数据库增量日志解析,提供增量数据订阅&消费

Canal是基于mysql主从同步实现的,mysql主从同步原理如下

Canal就是把自己伪装成mysql的一个slava节点,从而监听master的binary log变化,再把变化的信息通知给canal客户端,进而完成对其他数据库的同步

3、引入Canal

(1)先开启mysql主从同步

(2)安装Canal

(3)执行命令创建Canal容器: 

这样,我们就成功用Canal对mysql进行监听了

4、Canal客户端

接下来我们就更新tomcat的客户端,来监听Canal的消息

监听Canal我们首先先引入springboot整合canal的依赖,然后配置好canal

然后编写监听器来监听canal的消息

canal推送给canal客户端的是被修改的这一行数据,我们引入的canal客户端会帮助我们把这行数据封装到item实体类中,这个过程需要知道数据库和实体的映射关系,要用到注解来映射

业务逻辑:

总结

最后的架构图:

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

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

相关文章

Java 定时任务详解

文章目录单机定时任务技术选型TimerScheduledExecutorServiceSpring Task时间轮分布式定时任务技术选型QuartzElastic-JobXXL-JOB单机定时任务技术选型 Timer java.util.Timer是 JDK 1.3 开始就已经支持的一种定时任务的实现方式。 Timer 内部使用一个叫做 TaskQueue 的类存…

在GCP的Kubernetes上安装dapr

1 简介 我们之前使用了dapr的本地托管模式,但在生产中我们一般使用Kubernetes托管,本文介绍如何在GKE(GCP Kubernetes)安装dapr。 相关文章: dapr本地托管的服务调用体验与Java SDK的Spring Boot整合 dapr入门与本地托管模式尝试 2 安装…

STM32开发(2)----CubeMX的安装和使用

CubeMX的安装和使用前言一、CubeMX简介二、软件安装二、软件使用HSE 和 LSE 时钟源设置时钟树配置功能引脚配置配置 Debug 选项生成工程源码总结前言 本章对STM32CubeMX的安装和使用做简单介绍 一、CubeMX简介 STM32CubeMX是一种图形化工具,它允许非常简单地配置…

C++:指针

目录 1.指针 1.1指针三要素: 1.2修饰结构体struct 1.3 Pointers of Pointers 1.4constant修饰 pointer 2.指针和数组 2.1.数组的地址是连续的 2.2pointer arithmetic:指针的代数运算 2.3指针和数组的不同 3.内存分配: 1.指针 1.1指针三要素…

内卷潮不断袭来,智己汽车主打高端市场有何胜算?

当前,新能源汽车赛道已进入白热化,2022年全年产销迈入700万辆规模,分别达到705.8万辆和688.7万辆,同比分别增长96.9%和93.4%,市占率为25.6%。在政策和市场的双轮驱动下,新能源汽车市场的竞争愈发激烈。为掌…

SpringCloudAlibaba和nacos整合sentinel的简单案例

文章目录1.简单代码1.1依赖1.2配置文件配置1.2.1项目yml配置文件1.2.2nacos配置文件1.2controller1.3 service2.sentinel下载运行3.运行验证nacos的安装部署SpringCloudAlibaba整合nacos1.简单代码 1.1依赖 SpringBoot 2.3.12.RELEASE SpringCloudAlibaba 2.2.8.RELEASE <…

自动识别查找特定的串口号 比如设备管理器中Modem属性里的串口 按这个方法可以获取设备管理器任意信息。C++

1.目标&#xff1a; 自动识别查找特定的串口号 2.注册表里搜串口号 设备管理器中所有的信息都在注册表中有&#xff0c;那么我直接在注册表里搜COM143。 搜到了这个&#xff0c;但这里有2个名称key相同的。后面193,192还是可能会变的&#xff0c;不方便精确识别。继续搜。 这…

从0到1一步一步玩转openEuler--01 openEuler操作系统介绍

1 openEuler操作系统介绍 openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云…

JVM 基础 - Java 垃圾回收机制

Java 垃圾回收机制一&#xff1a;哪些内存需要回收二&#xff1a;怎么定义垃圾1、引用计数算法2、可达性分析算法3、方法区的回收三&#xff1a;引用类型1、强引用2、软引用3、弱引用4、虚引用四&#xff1a;怎么回收垃圾1、垃圾回收算法标记 - 清除算法标记 - 整理算法标记 - …

STM32MP157开发板Linux+Qt项目实战:智慧家庭

stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器&#xff0c;集成2个Cortex-A7核和1个Cortex-M4 核&#xff0c;A7核上可以跑Linux操作系统&#xff0c;M4核上可以跑FreeRT…

第八章 idea集成github

第八章 idea集成github 第一节 给 IDEA 安装github插件 在IDEA中连接github需要在IDEA中github插件(如果有的话就不用安装了) 我这个是已经安装的状态 &#xff08;安装过程中按照提示安装即可&#xff09; 第二节 在 IDEA 中设置github账号 方式一 用户名密码登录 这种方…

HTTPS、SSH共享端口的--工具SSLH

目录 使用的环境 一、安装SSLH 二、配置nginx服务器 三、配置SSLH 三、启用并启动 sslh 服务以更新更改 四、测试 使用的环境 Ubuntu作为靶机&#xff0c;centos7做测试 一、安装SSLH 在Ubuntu上安装命令如下 $ sudo apt-get install sslh 安装 SSLH 时&#xff0c;将…

【LeetCode】最长同值路径 [M](二叉树)

687. 最长同值路径 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定一个二叉树的 root &#xff0c;返回 最长的路径的长度 &#xff0c;这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示…

阿里二面: BigKey、HotKey 问题严重,该如何 预防和解决

BigKey、HotKey是 日常生产中经常会碰到由于redis集群的不当访问&#xff0c;造成的线上问题。 而且&#xff0c;这也是常见的面试题。 在咱们社群的面试交流中&#xff0c;有很多小伙伴在面试网易、滴滴、京东等大厂的二面、三面中遇到了这个问题。 前段时间&#xff0c;有…

Hadoop基础之《(9)—整合HBase+Phoenix+Hive》

一、HBase简介 1、HBase定义 Apache HBase是以HDFS为数据存储的&#xff0c;一种分布式、可扩展的NoSQL数据库&#xff08;非关系型&#xff0c;以k,v的形式存储数据&#xff09;。 HBase可以认为是以HDFS为存储的数据库。 2、HBase数据模型 &#xff08;1&#xff09;HBase的…

Python---方法(普通方法,类方法,静态方法)

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;Python基础已经更新完&#xff0c;接下来是Python面向对象的知识点。 方法前言普通方法类方法静态方法总结前言 方法是什么&#xff1f; 一个类&#xff0c;它有特征&#xff0c;也有动作&#xff0…

华为OD机试(2023)真题目录(Java JS Python)

本专栏算法题均来自2023华为OD机考新题库。 本专栏算法题全部支持Java、JavaScript、Python语言实现。 注意&#xff1a;本专栏只包含新题库题目&#xff0c;不包含老题库题目。如果想同时拥有新、老题库全部题目&#xff0c;请订阅华为OD机试&#xff08;2022&2023&#…

c/c++开发,C++类的常用基本函数实现案例

一、C类的常用基本函数 C类的常用基本函数主要包括&#xff1a;默认构造函数&#xff0c;普通构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数&#xff0c;赋值&#xff08;&#xff0c;运算符重载&#xff09;函数&#xff1a; 1.默认构造函数&#xff0c;在没有显式初…

苹果电脑怎么用移动硬盘ntfs?教你三招方法

苹果电脑怎么用移动硬盘ntfs&#xff1f;Mac可以正常读取NTFS外置设备上的文件&#xff0c;但是不能够正常往里面写入文件&#xff0c;同样不能对上面的文件进行编辑、删除、移动等&#xff0c;如果想要进行这些操作。 一、什么是NTFS NTFS是一个日志文件系统&#xff0c;这意…

稍纵即逝,读博期间要注意的事情 / 读博期间一定不要做的事

稍纵即逝&#xff0c;读博期间要注意的事情 读博期间一定不要做的10件事 tip&#xff1a;配图除了缓解文章疲劳&#xff0c;就没有其它意图了。 时间稍纵即逝&#xff0c;博士期间的科研时间其实非常紧张和短缺。对于刚入学的博士新生&#xff0c;尤其是直博生和长学制&#…