【多级缓存】多级缓存OpenResty,Canal,nginx本地缓存

多级缓存

  • 安装OpenResty
  • OpenResty入门
    • OpenResty获取请求参数
    • OpenResty向tomcat服务器发送请求
  • 在nginx与tomcat端之间添加redis缓存
  • Redis本地缓存
  • 缓存同步
    • 缓存同步策略
    • 基于Canal的异步通知
      • 安装Canal
    • Canal客户端

安装OpenResty

OpenResty是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用Web 服务和动态网关。具备下列特点:

  1. 具备Nginx的完整功能
  2. 基于Lua语言进行扩展,集成了大量精良的Lua库,第三方模块
  3. 允许使用Lua自定义业务逻辑,自定义库

官方地址:https://openresty.org/cn/

  • 在linux下安装
  1. 安装OpenResty的依赖开发库
    yum install -y pcre-devel openssl-devel gcc --skip-broken
  2. 在centos中添加openresty仓库
    yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
  3. 安装openResty
    yum install -y yum-utils
  4. 安装opm工具,是一个openresty的管理工具,可以帮助我们安装一个第三方的lua模块
    yum instally openrest -y -opm

默认情况下 openResty的安装目录是/usr/local/openresty
在这里插入图片描述
配置nginx环境变量
5. 打开配置文件vim /etc/profile
6. 在最下面添加
export NGINX_HOME=/usr/local/openresty/nginx
export PATH=${NGINX_HOME}/sbin:$PATH
7. 让配置生效
source /etc/profile
8. 启动nginx

# 启动nginx
nginx
# 重新加载配置
nginx -s reload
# 停止
nginx -s stop

在这里插入图片描述

OpenResty入门

这里由代理一个访问路径为例子:
在windows端的nginx中进行

  1. 在nginx.conf的http下面,添加对OpenResty的Lua模块的加载:
    在这里插入图片描述

  2. 在nginx.conf的server下面,添加对/api/item这个路径的监听:
    在这里插入图片描述

  3. Linux中niginx目录下创建lua文件夹,新建item.lua文件
    创建内容:
    在这里插入图片描述

  4. 重新加载配置
    nginx -s reload

OpenResty获取请求参数

OpenResty提供了各种API用来获取不同类型的参数:
在这里插入图片描述

OpenResty向tomcat服务器发送请求

nginx提供了内部API请求用以发送http请求:
在这里插入图片描述
返回的响应内容包括:
resp.status:响应状态码
resp.header:响应头,是一个table
resp.body:响应体,就是响应数据

注意:这里的path是路径,并不包含IP和端口,这个请求会被nginx内部的server监听并处理,可以使用反向代理
在这里插入图片描述

我们可以把http查询的请求封装到一个函数中,放到OpenResty函数库中,方便以后使用

  1. 创建文件/usr/local/openresty/lualib/common.lua
  2. 在文件中封装请求http查询的函数
    在这里插入图片描述
    如何使用这个封装函数,返回向tomcat请求的数据,在item.lua文件中
    在这里插入图片描述

注意:Openresty提供了一个cjson的模块用来处理JSON的序列化和反序列化
地址:https://github.com/openresty/lua-cjson/
如何使用:

  1. 引入json模块
    local cjson=require "cjson"
  2. 序列化:
    在这里插入图片描述
    反序列化:
    在这里插入图片描述

在nginx与tomcat端之间添加redis缓存

  • 冷启动和缓存预热

冷启动:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。
缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。

OpenResty提供了操作Redis的模块,只需要引入就能够使用
在这里插入图片描述
封装函数,用来释放Redis连接,放入连接池
在这里插入图片描述
封装函数,从Redis中读取数据并返回
在这里插入图片描述

Redis本地缓存

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

  1. 开启共享词典,在nginx.conf的http下添加配置:

在这里插入图片描述
2. 操作共享词典
在这里插入图片描述

缓存同步

缓存同步策略

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

基于Canal的异步通知

在这里插入图片描述

安装Canal

Canal是阿里巴巴旗下的开源项目,基于java开发,基于数据库增量日志解析,提供增量数据订阅&消费
地址:https://github.com/alibaba/canal

Canal是基于MySQL的主从同步来实现的,MySQL主从同步的原理如下:
在这里插入图片描述
MySOL master将数据变更写入二进制日志( binarylog)其中记录的数据叫binary log events
MySQLslave 将master的 binary log events拷贝到它的中继日志(relay log)
MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

Canal就是把自己伪装成MVSOL的一个slave节点,从而监听master的binarylog变化。再把得到的变化信息通知给Canal的客户端,进而完成对其它数据库的同步。

安装:

  1. 首先创建一个网络,将MySQL,Canal,MQ放在同一个Docker网络中:
    docker network create hhh
    让mysql加入这个网络
    docker network connect hhh mysql

  2. 将Canal镜像上传到虚拟机中,通过命令导入;
    docker load -i canal.tar

  3. 运行创建Canal容器
    docker run p 11111:11111 --name canal
    -e canal.destinations=hhh
    -e canal.instance.master.address=mysql:3306
    -e canal.instance.dbUsername=canal
    -e canal.instance.dbPassword=canal
    -e canal.instance.connectionCharset=UTF-8
    -e canal.instance.tsdb.enable=true
    -e canal.instance.gtidon=false
    -e canal.instance.filter.regex=hhh\…*
    –network hhh
    -d canal/canal-server:v1.1.5

Canal客户端

Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。
第三方开源的canal-starter:地址:https://github.com/NormanGyllenhaal/canal-client

  1. 引入依赖

在这里插入图片描述
2. 编写配置

canal:destination: hhh #要跟canal运行时设置的destination一致server: 192.168.75.135:11111 #canal地址
  1. 编写监听器,监听canal消息
//Item是指定表的实体类
@CanalTable("表名")
@Component
public class ItemHandler implements EntryHandler<Item>{@Overridepublic void insert(Item item){//新增数据到redis中//新增数据到JVM缓存}@Overridepublic void update(Item before,Item after){//更新redis数据//更新本地缓存//更新数据到JVM缓存}@Overridepublic void delete(Item item){//删除redis数据//清除本地缓存//从JVM中删除缓存}
}

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

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

相关文章

django序列化

path(get2/, views.HelloApiView().get), path(get2/, views.HelloApiView.as_view()) models class Student(models.Model):name models.CharField(max_length100,verbose_name姓名)age models.IntegerField(verbose_name年龄)sex models.BooleanField(default1,verbose_n…

【java超方便的导入导出工具类】SpringBoot操作Excel导入和导出

Excel导入和导出 一、前期准备 1、首先导入主要的依赖 <dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><depende…

thinkphp6 workerman无法使用框架Db/model等类库方法解决方案

thinkphp6 workerman无法使用框架Db/model相关操作解决 执行安装相关扩展 composer require webman/gateway-worker引入成功后编辑服务类文件,直接展示代码 <?phpnamespace app\server\controller;use GatewayWorker\BusinessWorker; use GatewayWorker\Gateway; use Gate…

算法设计与分析 3.2 牛顿法及改进、迭代法、矩阵谱半径、雅可比迭代、高斯迭代

思考题1 改进cosx&#xff1f;优化算法 关键点在于cos计算过于麻烦&#xff0c;而每次都要求sinx的值 故直接简化为cosx的导数 -sinx 即&#xff1a; 原&#xff1a;//double daoshu(double x) { // return 18 * x - cos(x); //} 改&#xff1a;double daoshu(double x) {retu…

闲话 ASP.NET Core 数据校验(二):FluentValidation 基本用法

前言 除了使用 ASP.NET Core 内置框架来校验数据&#xff0c;事实上&#xff0c;通过很多第三方框架校验数据&#xff0c;更具优势。 比如 FluentValidation&#xff0c;FluentValidation 是第三方的数据校验框架&#xff0c;具有许多优势&#xff0c;是开发人员首选的数据校验…

仅1年!!影响因子10+飙升至30+,Springer旗下的潜力优刊,未来可期!

【SciencePub学术】今天小编给大家带来了一本医学类的高分优刊解读&#xff0c;隶属于Springer出版社&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff0c;创刊时间不长&#xff0c;但影响因子仅1年时间从10直接飙升至30&#xff0c;领域相符的学者可考虑&#xff01; Sign…

Java 面向对象—重载和重写/覆盖(面试)

重载和重写/覆盖&#xff1a; 重载&#xff08;overload&#xff09;&#xff1a; Java重载是发生在本类中的&#xff0c;允许同一个类中&#xff0c;有多个同名方法存在&#xff0c;方法名可以相同&#xff0c;方法参数的个数和类型不同&#xff0c;即要求形参列表不一致。重载…

Vue后台系统demo小计

创建项目 1.报错 Error: command failed: npm install --loglevel error --legacy-peer-deps 措施1&#xff1a;node.js文件夹属性 》高级 》选择第一个允许 Users(XXX\Users) &#xff08;对我无用&#xff09; 措施2&#xff1a;PowerShell(以管理员身份运行) 》 cd 想存…

12_Scala_package

文章目录 Scaal面向对象编程1.回顾Java2.package可以多次声明3.设置作用域&#xff0c;设置上下级4.包可以当作对象使用5.import6.Scala用_取代Java *7.导入多个包8.屏蔽类9.类起别名10.import的规则11.有些包无需导入 Scaal面向对象编程 Scala是一门完全面向对象语言&#xf…

Redisson - tryLock 函数参数分析

这里有三个参数&#xff1a; waitTime&#xff1a;等待时间leaseTime&#xff1a;超时施放时间TimeUnit&#xff1a;时间单位 等待时间 如果 ABC… 多个线程去抢夺一把锁&#xff0c;A 成功了&#xff0c;如果设置的是 -1&#xff0c;那么 BCD... 就不等待&#xff0c;直接返…

Linux服务器终端软件termius以及Xshell + WinSCP组合

1. termius 官网地址&#xff1a;https://termius.com/ Termius是一个跨平台的SSH客户端&#xff0c;它提供了一个便捷的方式来远程连接和管理服务器、虚拟机和网络设备。以下是Termius的一些特点和功能&#xff1a; 跨平台支持&#xff1a;Termius可在多个操作系统上运行&…

基于Guava的异步线程结果监听:ListenableFuture

1.ListenableFuture概述&#xff1a; ListenableFuture是对原有Future的增强&#xff0c;它可以监听异步执行的过程&#xff0c;执行完了&#xff0c;自动触发回调操作。 除此之外&#xff0c;可以分别针对成功或者失败的情况做后续处理。 2.使用场景 你想拿到异步处理的结果…

Mycat(三)读写分离双主双从

文章目录 搭建双主双从双主机配置双从机配置双从配置两个主机互相复制停止从服务复制功能重新配置主从 修改 Mycat 的集群配置实现多种主从双主双从集群角色划分增加两个数据源修改集群配置文件读写分离配置扩展&#xff08;1&#xff09;读写分离(一主一从,无备)(m是主,s是从)…

「C/C++ 01」scanf()与回车滞留问题

目录 〇、scanf()接收用户输入的流程 一、回车的缓冲区滞留问题是什么&#xff1f; 二、为什么&#xff1f; 三、四个解决方法&#xff1a; 1. 在前面的scanf()中加上\n 2. 在scanf("%c")中添加空格 3. 使用getchar()来吸收回车 4. 使用fflush()清空缓冲区 〇、scan…

【火柴题】如何移动一根火柴将2变成5

这里写目录标题 如何移动一根棍子将2变成51、变成第五个字母E2、变成罗马数字5 V3、变成手写体54、商用字体55、古尔穆基数字、藏文数字56、希伯来数字5 如何不动棍子将2变成5使用镜子使用装水的水杯小孔成像透视 如何移动一根棍子将2变成5 1、变成第五个字母E E 2、变成罗马…

力扣HOT100 - 207. 课程表

解题思路&#xff1a; class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] inDegree new int[numCourses];//存每个结点的入度List<List<Integer>> res new ArrayList<>();//存结点之间依赖关系Queue<Integer>…

获客难题怎么破?揭秘那些企业高效拓客的背后秘密

在当今的商业环境中&#xff0c;客户资源的获取是企业生存和发展的关键。然而&#xff0c;传统的获客方式往往既耗时又费力&#xff0c;且效率不高。随着科技的进步和大数据的普及&#xff0c;一种新兴的获客工具——自动获客软件应运而生&#xff0c;它以其精准高效的特点&…

百度文库公测智能漫画和智能话本,有兴趣的可以申请一下

百度文库上线智能文库和智能话本功能&#xff0c;目前处于公测中&#xff0c;我刚申请&#xff0c;还在审核中。 智能漫画&#xff0c;参照官网的示例截图&#xff0c;生成的图片看起来不错&#xff0c;没试用过所以不太清楚他的操作模式是什么 智能话本&#xff0c;生成的话…

【高校科研前沿】华东师大白开旭教授博士研究生李珂为一作在RSE发表团队最新成果:基于波谱特征优化的全球大气甲烷智能反演技术

文章简介 论文名称&#xff1a;Developing unbiased estimation of atmospheric methane via machine learning and multiobjective programming based on TROPOMI and GOSAT data&#xff08;基于TROPOMI和GOSAT数据&#xff0c;通过机器学习和多目标规划实现大气甲烷的无偏估…

python学习笔记----函数(五)

一、函数介绍 在 Python 中&#xff0c;函数是一个组织好的、可重用的代码块&#xff0c;用来执行一个单一的、相关的动作。函数提供了代码的模块化和代码复用的能力。它可以接受输入参数&#xff0c;并可以返回一个结果。函数在 Python 编程中是基本的构建块之一。 二、函数…