【图解秒杀系列】秒杀技术点——静态化

news2024/12/26 6:21:59

【图解秒杀系列】秒杀技术点——静态化

  • 什么是静态化、静态化的作用
  • 如何实现静态化
    • FreeMarker、Thymleaf
      • 处理流程
      • 问题
    • OpenResty + Lua
      • lua_shared_dict & lua-resty-template
      • 处理流程
      • 具体操作

什么是静态化、静态化的作用

静态化就是指通过某种静态化技术,将原本需要动态渲染生成的HTML页面固定下来变成一个静态页面文件,后续请求该页面都直接返回该静态页面。

在这里插入图片描述

首先要有模板和数据,然后根据给定的模板和数据,通过模板引擎,就能生成对应的静态HTML文件。

在这里插入图片描述

生成的静态HTML页面,可以推到Nginx上缓存到Nginx本地。当用户请求访问对应的页面时,Nginx直接返回缓存在本地的静态页面,这样响应速度就大大提升。

在秒杀场景中,商品详情页就可以进行静态化处理,提升商品详情页的访问速度。

如何实现静态化

FreeMarker、Thymleaf

一种方式是通过FreeMarker、Thymleaf这种Java语言的模板引擎实现。

处理流程

FreeMarker、Thymleaf需要跑在一个Tomcat进程里面,当接收到请求时,通过Freemarker、Thymleaf等模板引擎技术,根据指定的模板和数据,生成静态HTML页面,返回客户端。

另外,我们可以监听MQ上的修改操作消息,当监听到有修改操作发生时,就在异步工程里面使用模板引擎生成静态HTML页面,然后推到Nginx上缓存到Nginx本地。

在这里插入图片描述

问题

但是这种方案会有几个问题。

首先第一个问题是,如果我们修改了模板,那么使用该模板生成的静态HTML页面全部都要删除或刷新。

在这里插入图片描述

第二个问题是如果我们有多个Nginx,则要同时推送给多个Nginx。

在这里插入图片描述
如果是多Nginx场景下,碰上批量刷新,那这个操作就很复杂了。

OpenResty + Lua

为了解决上面的问题,就有了一个更好的解决方案,那就是OpenResty加Lua脚本。

OpenResty是基于Nginx进行二次开发的Web平台,支持执行Lua脚本,并且内部集成了许多Lua库和第三方模块。

lua_shared_dict & lua-resty-template

在这个方案下,我们用到OpenResty的两个重要的东西,一个是“lua_shared_dict”指令、lua-resty-template模块。

lua_shared_dict用于声明一个共享内存区域,可以将其作为缓存空间使用,比如“lua_shared_dict my_cache 128m;”表示声明一个128m大小名为“my_cache”的内存共享区域。

而lua-resty-template模块的作用就是一个模板引擎,它的作用与FreeMarker或者Thymleaf类似,只是它是跑在OpenResty内部而不是后端服务。

处理流程

那么此时处理流程如下:

在这里插入图片描述

  1. 客户端的请求被OpenResty接收
  2. OpenResty在location块中通过content_by_lua_file命令指定执行的lua脚本
  3. lua脚本被执行,首先判断lua_shared_dict命令声明的缓存空间中是否缓存了对应的数据
  4. 如果缓存命中,则直接通过lua-resty-template模块进行模板渲染生成静态html文件并返回
  5. 如果缓存不命中,则请求后端服务获取对应数据,再缓存到lua_shared_dict命令声明的缓存空间中,然后再进行模板渲染生成静态html文件并返回

这么做的好处就是:

  • 即使模板变了,我们只需要更新OpenResty上的模板即可,由于最终的html文件是由OpenResty动态渲染生成的,所以只要更新了模板,生成的html就会更新。
  • 由于是OpenResty自己通过模板渲染生成的html,而不是后端服务生成的,因此不再需要推送ng的这一步操作。

具体操作

在nginx.conf文http模块中加入:

lua_package_path '../lualib/?.lua;;';
lua_package_cpath '../lualib/?.so;;';
include lua.conf;

lua.conf:

lua_shared_dict my_cache 128m;
server {
	listen 222;
	set $template_location "/templates";
	set $template_root "D:/ProgramData/nginx/";
	
	location /product {
		default_type 'text/html;charset=UTF‐8';
		lua_code_cache on;
		content_by_lua_file D:/ProgramData/nginx/product.lua;
	}
}

product.lua:

	local uri_args = ngx.req.get_uri_args()
	local productId = uri_args["productId"]
	local cache_ngx = ngx.shared.my_cache
	local productCacheKey = "product_info_"..productId
	local productCache = cache_ngx:get(productCacheKey)
	if productCache == "" or productCache == nil then
		local http = require("resty.http")
		local httpc = http.new()
		local resp, err = httpc:request_uri("http://127.0.0.1:8866",{
			method = "GET",
			path = "/pms/productInfo/"..productId
		})
		productCache = resp.body
		local expireTime = math.random(600,1200)
		cache_ngx:set(productCacheKey, productCache, expireTime)
	end
	local cjson = require("cjson")
	local productCacheJSON =cjson.decode(productCache)
	ngx.say(productCache);
	local context = {
		id = productCacheJSON.data.id,
		name = productCacheJSON.data.name,
		price = productCacheJSON.data.price,
		pic = productCacheJSON.data.pic,
		detailHtml = productCacheJSON.data.detailHtml
	}
	local template = require("resty.template")
	template.render("product.html", context)

html模板:

<html>
	<head>
		<meta http‐equiv="Content‐Type" content="text/html; charset=utf‐8" />
	</head>
	<body>
		<h1>
			商品id: {* id *}<br/>
			商品名称: {* name *}<br/>
			商品价格: {* price *}<br/>
			商品库存: <img src={* pic *}/><br/>
			商品描述: {* detailHtml *}<br/>
		</h1>
	</body>
</html>

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

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

相关文章

【动态规划、dp】P1091 [NOIP2004 提高组] 合唱队形 题解

题意 n n n 位同学站成一排&#xff0c;音乐老师要请其中的 n − k n−k n−k 位同学出列&#xff0c;使得剩下的 k k k 位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设 k k k 位同学从左到右依次编号为 1 , 2 , … , k 1,2, …,k 1,2,…,k&#xff0c;他…

Qt-创建第一个Qt项目(3)

目录 新建项目 设置路径 选择构建工具 父类的选择 各个父类的介绍 国际化相关的选项 选择SDK Summary选择 项目初见 新建项目 这一点和在VS里面是一样的&#xff0c;我们首先都得创建一个项目出来 进去之后就是选择项目模板了 我们使用默认的就行了&#xff0c;左边…

顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评

Q&#xff1a;顺丰科技2025届校园招聘面向对象是&#xff1f; A&#xff1a;2025届应届毕业生&#xff0c;毕业时间段为2024年10月1日至2025年9月30日&#xff08;不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘&#xff09;。 Q&#xff1a;我可以投递几个岗…

涉密载体管控系统DW-S402|实现载体管控新模式

涉密载体管控系统DW-S402是用于对各种涉密载体进行有效管理的智能柜&#xff08;智能管理系统&#xff09;&#xff0c;基于物联网技术实现对载体的智能化、规范化、标准化管理&#xff0c;广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 载体管控软件对涉密…

可用性检查和短缺部件检查

可用性检查 可用性检查有两种类型&#xff1a; “库存管理”中库存类型的可用性检查&#xff08;静态可用性检查&#xff09;从“物料需求计划”的角度检查可用库存&#xff08;动态可用性检查&#xff09; 库存类型的可用性检查&#xff08;静态可用性检查&#xff09; 此项…

全面解析ETL:数据仓库架构中的关键处理过程

目录 一、数据仓库架构中的ETL 二、数据抽取 &#xff08;1&#xff09;逻辑抽取 &#xff08;2&#xff09;物理抽取 &#xff08;3&#xff09;变化数据捕获 三、数据转换 四、数据装载 &#xff08;1&#xff09;提高装载效率 &#xff08;2&#xff09;处理装载失败 五、ET…

MacOS 下运行 GPT-SoVITS

系统环境&#xff1a; # 安装 ffmpeg brew install ffmpeg # 查看版本 ffmpeg -version # 拉取项目代码 git clone --depth1 https://github.com/RVC-Boss/GPT-SoVITS cd GPT-SoVITS # 安装好 Miniconda 之后&#xff0c;先创建一个虚拟环境&#xff1a; conda create -n GPT…

关于Qt的系统总结

查看详情http://100bcw.com/qt6.htm 编译环境与开发流程 开发QT有两种IDE可以使用,一种是使用 VS + Qt 的插件,另一种就是使用QtCreator工具。前一种是微软的工具,用的都比较多容易上手,缺点是信号槽的支持不太好,需要手写,不能自动生成,另外可能有中文编码的问题。后一…

PSINS工具箱函数介绍——trjfile

文章目录 关于工具箱使用方法运行代码运行方法运行结果输出数据的解释 源代码 关于工具箱 trjfile是导入轨迹数据的函数&#xff0c;在文件夹"psins \base\io"里面&#xff0c;用于导入轨迹相关的mat文件。 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲…

Centos7.9 Kickstart自动应答,无人值守安装

有时候安装一两台服务器是轻松的事&#xff0c;但是如果要安装2&#xff0c;3百台的时候那就不是很轻松了&#xff0c;这时候无人值守的操作系统安装就变得非常重要。通过网络自动安装是非常方便而且快捷的。 先关闭防火墙吧 systemctl stop firewalld systemctl disable fire…

安卓蓝牙日志的获取方法

有过蓝牙调试经历的同学们可能都知道&#xff0c;在安卓系统中&#xff0c;在手机的设置–>开发人员页面下有一个开启蓝牙HCI信息收集日志选项开关&#xff0c;如下图中标红处&#xff0c; 打开该开关&#xff0c;就可以收集本机发送和接收的蓝牙HCI包。蓝牙包的数据会保存在…

Java算法解析一:二分算法及其衍生出来的问题

这个算法的前提是&#xff0c;数组是升序排列的 算法描述&#xff1a; i和j是指针可以表示查找范围 m为中间值 当目标值targat比m大时&#xff0c;设置查找范围在m右边&#xff1a;i m-1 当目标值targat比m小时&#xff0c;设置查找范围在m左边&#xff1a;j m1 当targat的…

苹果手机垃圾清理:释放存储空间的终极指南

随着iPhone成为我们日常生活的重要组成部分&#xff0c;我们越来越多地依赖它来处理个人和工作相关的事务。然而&#xff0c;长时间的使用会让iPhone积累大量不必要的数据和文件&#xff0c;这些所谓的“手机垃圾”不仅占用了宝贵的存储空间&#xff0c;还可能影响设备的性能。…

【Vite】模块热替换 HMR

概述 Vite 提供了一套原生 ESM 的 HMR API。 具有 HMR 功能的框架可以利用该 API 提供即时、准确的更新&#xff0c;而无需重新加载页面或清除应用程序状态。当通过 create-vite 创建应用程序时&#xff0c;所选模板已经预先配置了相关的集成。 HMR API Vite 通过特殊的 imp…

C++初学(12)

前段时间去旅游了&#xff0c;回来继续写。 12、指针、数组和指针算术 对上一篇进行的补充 #include <iostream> int main() {using namespace std;double wages[3] { 10000.0,20000.0,30000.0 };short stacks[3] { 3,2,1 };double* pw wages;short* ps &stack…

实时监控Windows服务器:使用Prometheus和Grafana的终极方案

1. 下载并安装 Prometheus 下载 Prometheus&#xff1a; 访问 Prometheus 下载页面。下载适用于 Windows 的压缩包&#xff08;.zip 文件&#xff09;。prometheus-2.53.2.windows-amd64.zip 下载其中一个就行 安装 Prometheus&#xff1a; 解压下载的压缩包到你选择的目录&a…

欧拉远程桌面 安装tigervnc

注意&#xff1a;安装远程tigevnc前提必须已经安装桌面环境&#xff0c;以下为ukui桌面环境&#xff0c;dde稍有区别&#xff1b; 1、关闭selinux 注意&#xff1a;selinux为安全措施也可以加入对应规则 setenforce 0 sed -i s/^SELINUXenforcing.*/SELINUXdisabled/ /etc/sel…

基于大模型的AI论文简报生成系统

1、项目介绍 1.1 项目名称 AI 论文简报生成系统 1.2 项目简介 AI 论文简报生成系统是一款基于当前时间自动获取最新AI研究论文简报的桌面应用程序。通过集成各类大模型Kimi、deepSeek&#xff0c;OpenAI等模型API与多步数据处理脚本&#xff0c;该系统能够在用户指定的时间…

考勤系统选型难?9款工具深度对比助你决策

这篇文章介绍的工具有&#xff1a;Moka、天时考勤管理专家、劳勤、新开普、通达OA、OnTheClock、monday.com、Paycor、Beebole。 很多企业在选择考勤管理系统时都会面临一个难题&#xff1a;市场上的选项太多&#xff0c;功能繁杂&#xff0c;如何才能找到最适合自己业务需求的…

美团外卖新版 web mtgsig 1.2 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、 敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业 用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像或私信联…