多级缓存

传统缓存: 传统缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库。

这种模式下请求一定要经过Tomcat处理,Tomcat的性能就成为了整个系统的瓶颈;并且Redis的缓存也有过期时间,一旦过期,请求依旧会直接打到数据库,对数据库带来冲击。

多级缓存: 多级缓存就是充分利用请求处理的每个环节,分别添加上缓存,减轻tomcat压力,提升服务器性能。例如:浏览器客户端缓存Nginx本地缓存Redis缓存Tomcat进程缓存 。(缓存从左到右依次向下,最后到达数据库,注意这里的Redis缓存在Tomcat前面了,因为Nginx里也可以编程)

垂直分表

同一个商品的信息可以考虑保存在两张表里面,关于这个商品的不同类型的信息各自保存在一个表里面。例如可以是商品库存和售出信息保存在一张表,商品的基本信息保存在另外一张表里面,这样当商品库存发生变化的时候,缓存中的商品基本信息可以不用改动。

Nginx

nginx是 反向代理服务器(接收客户端请求,转发给后端服务)负载均衡器(多个后端服务之间分发请求,提高系统吞吐量)静态资源服务器(提供HTML、CSS、JS、图片等静态资源) 等。 用户的请求会先来到Nginx,静态资源在nginx中获取,页面上的数据通过ajax异步地从后端服务中获取。

Caffeine

分布式缓存: 例如Redis,可以在集群中 共享 ,容量更大,可靠性更高。但是会有网络IO地开销。

进程本地缓存: 例如HashMap、GuavaCache等,缓存在本地,没有网络IO开销,速度更快。但是存储容量有限,且集群间无法共享。

Caffeine是目前性能最高,更强大的缓存库。它可以设置缓存的 容量过期策略(按时间过期、按容量过期)超强的并发性能

Lua脚本

由于我们将redis层放在的tomcat进程层的上一层,所以操作redis的事情就由nginx来干了,而Lua是操作nginx的语言。

lua是一种轻量小巧的脚本语言,用C语言编写,设计目的是嵌入应用程序中。

OpenResty

OpenResty是一个基于Nginx的高性能Web平台,通过Lua扩展Nginx实现的可伸缩的Web平台。OpenResty内置了Nginx,在nginx的基础上进行了功能的扩展,可以直接把这个当成nginx来使用,只是可以有更多的功能。

本来nginx是拦截请求之后转发给后端的tomcat服务器来处理,现在是交给lua脚本来处理,在lua脚本中填写业务逻辑。

原生的Nginx不支持lua模块,我们就没办法再nginx中做业务处理。有了OpenResty之后,我们就可以在Nginx中引入lua脚本模块,然后通过编写lua脚本在nginx做业务逻辑的处理,可以在nginx层就做一层缓存,浏览器请求先被nginx捕捉到然后执行lua脚本,脚本中封装了http请求,再将该请求发送出去由nginx转发给后续业务(redis层或者tomcat层)。

Redis缓存预热

服务刚刚启动时,redis中并没有缓存,如果所有商品数据都在第一次查询的时候添加缓存,那么数据库就会面临很大的压力。所以就要在实际开发中做缓存的预热,利用大数据统计用户访问的热点数据,在项目启动的时候将这些热点数据提前放到缓存中。

通过配置一个RedisHandler的Bean实现Initializing接口并且实现afterPropertieSet()方法,在其中实现缓存预热。这里涉及到Bean的生命周期,这个afterPropertieSet方法是在Bean的依赖注入之后自动调用。

Nginx层查询Redis

OpenResty也为Nginx提供了操作Redis的模块,只要引入该模块就能直接使用,直接操作Redis了。这里和redis建立连接使用的是长连接,使用完后会放进连接池,规定时间没用该连接才会被释放。

Nginx本地缓存

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

修改item.lua中的read_data函数,优先查询本地缓存,未命中的时候再查询Redis、Tomcat,查询Redis和Tomcat成功后,将数据写入本地缓存,并设置有效期。

数据同步

数据库(真实数据)与缓存数据的一致性是我们要解决的问题,也就是数据同步问题。

常见的数据同步方法有3种:

设置有效期: 缓存设置有效期,到期自动删除,再次查询的时候更新。

同步双写: 更新数据库的时候,直接修改缓存。

异步通知: 更新数据库的时候发送事件通知,使用MQ或者其它机制(监听数据库binlog)来接收通知后修改缓存数据。

Canal监听binlog

camal是通过mysql的主从同步使用的binlog来实现了,canal把自己伪装成了一个slave节点,然后需要监听的mysql作为master生成binlog,canal不断去读取master的binlog,如果binlog发生变化了,那么canal立刻就知道了,然后根据变化来进行后续的处理。所以要想使用canal,还要去实现mysql的 主从同步

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

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

相关文章

接口自动化-JSON Schema

目录 1.介绍 2.安装 3.使用 3.1type关键字 3.2最大值最小值 3.2.1minimum 、 maximum 3.2.2 exclusiveMinimum 、exclusiveMaximum 3.3字符串特殊校验 3.4数据约束 3.5对象约束 3.6必须属性 3.7依赖关系 4.总结 1.介绍 JSON Schema 是一个用来定义和校验 JSON 的…

前端技术架构设计文档(Vue2+Antd+Sass)

前端技术架构设计文档(Vue2AntdSass) 文档信息项目名称前端系统(基于 Vue2 技术栈)技术栈核心Vue2 Ant Design Vue Sass版本号V1.0.0技术栈核心Vue2 Ant Design Vue Sass编制日期2025-08-071. 技术栈选型 1.1 核心技术框架类别…

【设计模式】抽象工厂模式 (工具(Kit)模式)

抽象工厂模式(Abstract Factory Pattern)详解一、抽象工厂模式简介 抽象工厂模式(Abstract Factory Pattern) 是一种 创建型设计模式(对象创建型模式),它提供了一种创建一系列相关或相互依赖对象…

Android初学者系统开发学习路线参考

Android初学者系统开发学习路线参考 文章目录Android初学者系统开发学习路线参考一、前言二、Android初学的学习计划第一阶段(一个月)UI相关学习:开发环境与 UI 基础,第一周:UI 控件与布局进阶,第二周&…

扩散LLM推理新范式:打破生成长度限制,实现动态自适应调节

随着 Gemini-Diffusion,Seed-Diffusion 等扩散大语言模型(DLLM)的发布,这一领域成为了工业界和学术界的热门方向。但是,当前 DLLM 存在着在推理时必须采用预设固定长度的限制,对于不同任务都需要专门调整才…

【ee类保研面试】其他类---计算机网络

25保研er,希望将自己的面试复习分享出来,供大家参考 part0—英语类 part1—通信类 part2—信号类 part3—高数类 part100—self项目准备 文章目录计算机网络知识点大全**计算机网络知识点总结**一、五层协议模型二、OSI七层模型补充三、TCP 与 UDP 及区别…

Python-机器学习(一)——特征工程

目录 特征工程 一、特征提取 1、字典特征提取 2、文本特征提取 2.1 英文文本提取 2.2 中文文本提取 3、TF-IDF文本特征词的重要程度特征提取 二、无量纲化-预处理 1 MinMaxScaler 归一化 2 normalize归一化 3 StandardScaler 标准化 三、特征降维 1、特征选择 1.…

谈谈SQL计算存储引擎中的索引和计算

背景 最近在这家公司做了一些事情,做的事情和以往的工作不太一样,不一样的点呢就是 之前我主要的工作是关注计算这方面,因为数据量大,研究的是怎么加速查询,怎么研究规则去优化,怎么去解规则的bug等等。因为…

vscode.window.activeTextEditor 获取不到 png 图片路径问题

vscode 的 extensions 插件开发时用 vscode.window.activeTextEditor?.document.uri 获取不到编辑器打开的图片路径,文档路径可以获取到。个人猜测因为图片不能编辑,所以没有 activeTextEditor 属性吧。解决办法:巧用右键获取路径和相对的路…

Java 大视界 -- Java 大数据在智能医疗手术机器人操作数据记录与性能评估中的应用(390)

Java 大视界 -- Java 大数据在智能医疗手术机器人操作数据记录与性能评估中的应用(390)引言:正文:一、传统手术机器人的 “黑箱困境”:记不全、算不清、追不到1.1 设备与临床的 “断层”1.1.1 数据记录 “太粗放”1.1.…

C++的结构体指针

结构体变量和结构体指针的区别特性结构体变量结构体指针存储内容结构体的实际数据内存地址内存开销结构体总大小固定4/8字节(指针大小)成员访问运算符.->函数传参时的行为值拷贝(新副本)地址传递(操作原数据&#x…

pdf文件转word免费使用几个工具

在线工具(无需安装) Smallpdf ✅ 核心功能: 网页端直接操作,支持 PDF 与 Word 格式互转 免费用户每日限 2 次转换(免注册) 自动清除服务器文件,确保隐私安全 🔗 访问链接&#xff1a…

Vue3 组件化开发

文章目录前言组件化开发底部菜单 TabMenu父子组件相互传数据父传子:自定义属性子传父:自定义事件父子组件互传案例插槽 slot多个插槽总结组件化开发总结Vue组件的基本组成子组件使用的三个步骤父子组件相互传递数据前言 提示:这里可以添加本…

服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?

I2C 总线传输速率与上拉电阻关系密切。上拉电阻阻值决定总线电平切换速度:电阻越小,充放电电流越大,信号边沿更陡,支持更高速率(如 400kHz 快速模式);电阻过大则切换慢,限制速率&…

大语言模型提示工程与应用:LLMs文本生成与数据标注实践

提示词应用实践 学习目标 本课程通过LLMs生成情感分析样本和标注葡萄9品鉴数据,展示了其文本生成和数据标注能力。同时,利用PAL模型解决日期计算问题,学习了LLMs与编程运行时结合实现复杂推理的方法,为自然语言处理应用提供了实…

node.js 零基础入门

Node.js 零 基础入门与核心语法 适用对象:完全没接触过 Node.js 的同学 目标:从 0 到能写 CLI、小型 HTTP 服务、文件脚本、调用系统/网络资源 目录 什么是 Node.js安装与运行运行脚本与 REPL模块体系:CommonJS 与 ES Modules基础语法在 Node…

《Day3-PyTorch 自动微分入门:从计算图到梯度下降的实践指南》

八、自动微分自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。1. 基础概念张量Torch中一切皆为张量…

apache cgi测试

test.cgi #!/bin/sh echo "Content-type: text/html" echo "" echo "<h1>Hello from a Mac CGI script!</h1>" echo "<p>Current time is: $(date)</p>"ƒ% 放置目录 /opt/homebrew/Cellar/mapserver/8.4.0_1…

力扣 30 天 JavaScript 挑战 第二题笔记

这道题是涉及知识–闭包 1. 闭包定义以及相关知识点 官方定义为&#xff1a;在 JavaScript 中&#xff0c;函数具有对在相同作用域以及任何外部作用域中声明的所有变量的引用。这些作用域被称为函数的 词法环境。函数与其环境的组合被称为 闭包。 简单理解&#xff1a;内层函数…

OpenAI GPT-5 深度解析:API Key定价与ChatGPT(Free, Plus, Pro)用户的区别

前言&#xff1a;两年等待&#xff0c;只为这一跃 在科技圈长达两年的屏息期待与无尽猜想之后&#xff0c;2025年8月8日北京时间凌晨&#xff0c;OpenAI终于揭开了其新一代旗舰模型——GPT-5的神秘面纱。这不仅仅是一次常规的产品迭代&#xff0c;更被整个行业视为一块试金石&a…