多级缓存(nginx本地缓存、JVM进程缓存、redis缓存)

文章目录

    • 整体示意图
    • 1.nginx缓存
    • 2.进程缓存
        • Caffeine示例
    • 3.Lua语法(为了在nginx中做编程)
    • 4.OpenResty
    • 5.封装向Tomcat发送的Http请求,获取数据
    • 6.Tomcat集群的负载均衡
    • 7.redis缓存
    • 8.查询Redis缓存
    • 9.Nginx本地缓存

整体示意图

在这里插入图片描述

1.nginx缓存

在这里插入图片描述

2.进程缓存

Caffeine示例

在这里插入图片描述

在这里插入图片描述

3.Lua语法(为了在nginx中做编程)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.OpenResty

在这里插入图片描述

5.封装向Tomcat发送的Http请求,获取数据

在这里插入图片描述

在这里插入图片描述

封装完函数之后,我们对nginx.conf进行修改(请求进来之后会去寻找item.lua)

在这里插入图片描述

item.lua文件内容

在这里插入图片描述

上面的item.lua文件中需要进行拼接数据,我们需要JSON结果处理

在这里插入图片描述

6.Tomcat集群的负载均衡

在实际生产中tomcat是肯定以集群的方式存在

当我们修改nginx.conf发送请求为集群的时候,如下图

在这里插入图片描述

这个时候存在一个问题,集群的负载均衡算法是轮询,会导致tomcat进程缓存产生浪费,举个例子

  • 假如现在有两台Tomcat服务器,一台端口为8080,一台端口为8081
  • 进行访问,查询id为1的信息,第一次查询8080端口的tomcat服务器,此时8080端口的tomcat服务器上有id为1信息的缓存,但是当我们再次查询id为1的信息,因为轮询的机制,会查询8081端口的tomcat服务器,但是id为1的进程缓存在8080端口的tomcat服务器上,并且进程缓存在集群之间不会共享,这就导致会发生一种情况,有多少tomcat服务器,就会有多少份进程缓存,这对资源是一种极大的浪费

解决方法:更换负载均衡算法为 hash $request_uri

在这里插入图片描述

这种负载均衡算法是通过对id值进行hash运算然后进行对tomcat服务器数量取余来判断访问哪台tomcat服务器,这样就保证了同一个id访问同一个tomcat服务器

7.redis缓存

两个问题

在这里插入图片描述

缓存预热代码(逻辑代码根据自己的更换即可)

public class CaffeineConfig implements InitializingBean {@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate IItemService itemService;@Autowiredprivate IItemStockService itemStockService;private static final ObjectMapper MAPPER = new ObjectMapper();@Overridepublic void afterPropertiesSet() throws Exception {// 初始化缓存// 1.查询商品信息List<Item> 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.查询商品库存信息List<ItemStock> stockList = itemStockService.list();// 2.放入缓存for (ItemStock stock : stockList) {// 2.1 item序列化为JSONString json = MAPPER.writeValueAsString(stock);// 2.2 存入redisredisTemplate.opsForValue().set("item:stock:id:" + stock.getId(),json);}}
}

API简介

InitializingBean

  • 一定要实现其中的afterPropertiesSet()方法
  • 该方法会在创建Bean之后执行,也就是项目启动的时候执行,也就可以实现缓存预热效果了

ObjectMapper

  • spring自带的json序列化工具

8.查询Redis缓存

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9.Nginx本地缓存

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

纯前端实现加减运算验证码

纯前端实现加减运算验证码 实现效果 //页面展示 <template><view class"form-input-item" style"padding:8rpx 22rpx;"><input class"form-input" placeholder"请输入验证码" type"text" maxlength"6…

使用Python读写Redis——Lists

之前详细介绍了 Redis命令 - Lists命令组常用命令&#xff0c;同样的命令&#xff0c;本文将用python调用redis库封装好的方法。 要操作的Lists命令如下 1、LSET key index value 2、LINSERT key BEFORE|AFTER pivot value 3、LPUSH key value [value …] 4、RPUSH key value …

【加速排坑】docker设置国内image镜像源

第零步&#xff0c;查看阿里最新的镜像源&#xff1a;https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 第一步&#xff1a;在/etc/docker/daemon.json中添加镜像源 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-m…

C++随机数生成:std标准库和Qt自带方法

std标准库 std::rand()是C中的一个随机数函数&#xff0c;它生成一个范围在0到RAND_MAX之间的伪随机整数。 在使用std::rand()之前&#xff0c;需要包含<cstdlib>头文件。 #include <cstdlib> 设置种子 在每次程序运行时&#xff0c;通常需要使用不同的种子值…

基于pyqt5+scapy 根据ip 具体端口 进行扫描 的程序

先给出代码 import sysfrom PyQt5 import uic from PyQt5.QtWidgets import *from scapy.all import * import argparse import logging from scapy.layers.inet import IP, TCP from scapy.sendrecv import sr1class MyWindow(QWidget):def __init__(self):super().__init__(…

【QML COOK】- 010-动态创建组件

上节介绍了Component的概念&#xff0c;本节介绍一下如何使用javascript动态创建对象。 1. 创建工程&#xff0c;新建一个MyComponent.qml的qml import QtQuickRectangle {color: "red" }它很简单就是一个红色框 2. 编辑main.qml import QtQuickWindow {id: root…

Vscode 上安装 Compilot

GitHub Copilot 是由 OpenAI 和 GitHub 开发的 AI 工具。其目的是通过自动完成代码来帮助开发人员使用集成开发环境 &#xff08;IDE&#xff09;&#xff0c;如 Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有已在候补名单上被接受的用户才能访问它。对…

MySQL 管理端口

错误 客户出现 MySQL连接数 超过 最大连接数的现象 ERROR 1040 (HY000): Too many connections 出现该现象&#xff0c;一般的解决方法&#xff1a; 1.修改配置文件中的最大连接数&#xff0c;之后重启数据库 2.如果配置文件中没有设置 连接超时时间的参数。8小时后&#…

xbox如何提升下载速度

Xbox下载速度慢的问题通常是由于网络环境或微软服务器的问题。以下是一些提升Xbox下载速度的方法&#xff1a; 使用加速器&#xff1a;如果您的网络环境不稳定或存在其他问题&#xff0c;可以使用加速器来优化网络环境&#xff0c;从而提高下载速度。检查网络连接&#xff1a;…

gin-vue-admin二开使用雪花算法生成唯一标识 id

场景介绍 需求场景&#xff1a; 总部采集分支的数据&#xff0c;由于分支的 id 是子增的主键 id&#xff0c;所以会出现重复的 id&#xff0c;但是这个 id 需要作为标识&#xff0c;没有实际作用&#xff0c;这里选择的是分布式 id 雪花算法生成 id 存储用来标识&#xff0c;这…

GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总

文章目录 0 入门资料1 物理引擎基本概念Actor & shapesRigid body dynamicsCollision DetectionCollision Resolution 应用与实践Character controllerRagdoll 0 入门资料 GAMES104-现代游戏引擎&#xff1a;从入门到实践_课程视频_bilibiliGAMES104官方账号 - 知乎课程主页…

微服务实战项目_天机学堂01_初识项目

文章目录 一.项目简述二.Jenkins三.模拟真实业务:紧急bug修复和代码阅读 一.项目简述 Q:天机学堂是什么? A:天机学堂是一个基于微服务架构的生产级在线教育项目 主要有两个端(项目已上线,可以点击查看): 管理后台: https://tjxt-admin.itheima.net 其核心业务主体包括老师、…

QT上位机开发(dock窗口在软件布局中的应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在软件开发中&#xff0c;一般有主窗口和子窗口之分。主窗口也就是main window&#xff0c;是最重要的操作界面。子窗口就是各种属性配置、参数配置…

NOIP2018提高组day2 - T1:旅行

题目链接 [NOIP2018 提高组] 旅行 题目描述 小 Y 是一个爱好旅行的 OIer。她来到 X 国&#xff0c;打算将各个城市都玩一遍。 小 Y 了解到&#xff0c;X 国的 n n n 个城市之间有 m m m 条双向道路。每条双向道路连接两个城市。 不存在两条连接同一对城市的道路&#xff…

uniapp使用安装sass

1.首先你要安装node-sass npm install node-sass --save-dev2.安装sass-loader npm install sass-loader --save-dev3.修改style标签&#xff0c;声明使用sass <style lang"scss" scoped>

做完十年数据分析后的思考与总结

种一棵树最好的时间是十年前&#xff0c;其次是现在。十年了&#xff0c;本次分享大多来自工作中的日常所思所想&#xff0c;欢迎自取。 01 数据分析的本质 数据是基础&#xff0c;分析才是重点。 行业内有专门的统计岗&#xff0c;就是只负责做好数据统计就可以了&#xff0…

【Python】PyCharm设置控制台输出的行数限制

在使用PyCharm的时候&#xff0c;如果在控制台输出的信息过多室&#xff0c;控制台仅会保留一部分的输出信息。想要改变这个限制&#xff0c;设置方法如下&#xff1a; 进入到PyCharm的安装目录下&#xff0c;我的是C:\Develop\PyCharm202303\PyCharm 2023.3进入bin找到文件id…

sqlite | c++ | demo

sqlite 过得的废话 就不细说了 接下来&#xff0c;主要讲 安装sqlite 然后写一个demo &#xff0c;然后再shell 命令操作sqlite #安装 sqlite 程序 以及开发包 我的linux 环境是centos sudo yum install sqlite-3.7.17-8.el7_7.1.x86_64 sqlite-devel#输入 sqlite3 测试是否安装…

django后台登录:Forbidden (403) CSRF verification failed. Request aborted.

如果您在尝试登录Django后台时遇到了CSRF验证失败的错误&#xff0c;这通常意味着您的浏览器未能提交正确的CSRF令牌&#xff0c;或者Django后端未能验证该令牌。遵循以下步骤来解决这个问题&#xff1a; 清除浏览器Cookies和缓存&#xff1a; 有时候&#xff0c;浏览器的Cooki…

Linux systemd的概述与发展历程

systemd是一个系统和服务管理器&#xff0c;广泛用于现代Linux系统。它的设计目标是取代传统的SysVinit作为Linux系统的初始化系统&#xff0c;提供更快的启动速度、更好的并行性和更多的功能。本文将对systemd进行概述&#xff0c;并探讨其发展历程。 初始化系统 systemd负责…