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

server/2024/10/22 18:24:48/

多级缓存

  • 安装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. 序列化:
    在这里插入图片描述
    反序列化:
    在这里插入图片描述

nginxtomcatredis_88">在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.ppmy.cn/server/24201.html

相关文章

电力能源箱3D可视化:开启智慧能源管理新篇章

随着科技的不断进步&#xff0c;电力能源箱的管理与维护逐渐向着智能化、可视化的方向发展。3D可视化技术的崛起&#xff0c;不仅极大地提升了能源管理的效率&#xff0c;更以其直观、生动的特点&#xff0c;引领着电力能源管理领域迈入了一个全新的时代。 电力能源箱作为电力系…

RAGFlow:引领OCR与文档解析技术革新的下一代RAG引擎

引言 在人工智能的蓬勃发展浪潮中,检索增强生成(RAG)技术凭借其独特优势,迅速成为研究和应用的焦点。RAG技术巧妙地将大型语言模型(LLMs)的卓越生成能力与高效的信息检索系统相结合,为用户带来前所未有的交互体验。然而,随着技术的深入应用,一系列挑战也逐渐浮出水面…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图&#xff08;引js文件版&#xff09; 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue&#xff0c;创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…

探索Jellyfin:支持Android的自由开源的媒体服务器平台

探索Jellyfin&#xff1a;支持Android的自由开源的媒体服务器平台 I. 简介 A. 什么是Jellyfin&#xff1f; Jellyfin是一个自由开源的媒体服务器平台&#xff0c;旨在让用户能够自主管理和流式传输他们的媒体内容。与许多闭源的商业媒体服务器解决方案不同&#xff0c;Jelly…

解析Redis Key Prefix配置之谜:双冒号“::”的由来与作用

前言 在使用Spring Boot集成Redis进行应用开发时&#xff0c;为了增强缓存键的可读性和管理性&#xff0c;我们常常会在配置文件中设定一个全局的key-prefix。如果你发现存储至Redis的键自动附加了“::”&#xff0c;本文将深入探讨这一现象背后的原因&#xff0c;解析Spring …

linux shell命令 (一)

基础命令 cd 切换命令 ls 查看当前目录下所有的文件 cp a.c b.c 拷贝a.c 到 b.c touch a.c 创建a.c文件 mkdir file 创建文件夹file rm file 删除文件 rmdir 删除test文件夹 rmdir test/ mv 移动文件 mv a.c b.c 把a.c 替换成b.c ifconfig 查看电脑网络信息 rm xx 删…

高德地图在vue3项目中使用:实现画矢量图、编辑矢量图

使用高德地图实现画多边形、矩形、圆&#xff0c;并进行编辑保存和回显。 1、准备工作 参考高德地图官网&#xff0c;进行项目key申请&#xff0c;链接: 准备 2、项目安装依赖 npm i amap/amap-jsapi-loader --save3、地图容器 html <template><!-- 绘制地图区域…

清理 Conda 和 pip 缓存

清理 Conda 缓存 查看 Conda 缓存的使用情况 conda clean --dry-run --all 删除不再使用的包和缓存 conda clean --all 清理 pip 缓存 Python缓存文件的默认位置&#xff1a; Windows 10&#xff1a;C:\Users\username\AppData\Local\pip\Cache macOS&#xff1a;/Users/…