使用Lua脚本实现高并发处理方案

article/2025/9/25 15:49:42

我们使用 Lua 脚本可以很轻松构建出百万并发的应用系统。

由于 Tomcat 并发处理能力弱,nginx 并发处理能力强我们可以在 nginx 上结合 Lua 脚本来高效处理业务逻辑,不用经过 Tomcat,就能够通过 Lua 脚本来操作 Redis、Kafka、MySQL 等,比如:在秒杀活动中,我们把针对获取商品详情页的内容使用 Lua 脚本方式,通过 nginx 的 Lua 脚本接收到请求,在 nginx 上完成对应业务处理代码逻辑,避免访问后端应用服务器。

但不推荐在程序中大量使用 Lua 脚本,Lua 脚本很多就不方便管理,我们一般使用 Lua 脚本来实现高并发的业务流程

在这里插入图片描述
说了这么多,可能还有兄弟萌不明白什么是 Lua 脚本,下面我们简单说一下什么是 Lua 脚本?

Lua 是一个由 C 语言编写的小巧的脚本语言,其设计目的是为了通过灵活嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。在所有的脚本引擎中,Lua 的速度是最快的,Lua 是作为嵌入式脚本的最佳选择。但 Lua 并没有提供强大的库,这是由它的定位决定的。所以 Lua 不适合作为开发独立应用程序的语言。

1.Lua 脚本高效访问数据库

在这里插入图片描述

  1. 首先需要安装 openresty,进入 lua 目录,编写 lua 脚本
    在这里插入图片描述
  2. 通过修改 nginx 的配置文件,在 nginx 中实现 lua 脚本的调用
    在这里插入图片描述
  3. 重启 nginx,访问:http://192.168.40.96/mysql?id=1

2.Lua 高效操作 Redis 集群

  1. 进入 lua 目录,编写 lua 脚本在这里插入图片描述
  2. 在 nginx 中实现 lua 脚本的调用
    在这里插入图片描述
  3. 重启 nginx,访问:192.168.211.141/redis?id=aaa&value=itheima&method=1

3.Lua 高效实现令牌校验

以前用户身份校验都是在 java 程序处实现,但如果用户发起大量无效请求,占用 Tomcat 资源,我们可以考虑直接在 nginx 处实现身份校验。
在这里插入图片描述

总结:在 nginx 上使用 Lua 脚本完成身份鉴权,这样可以减小后端压力 & 过滤掉无效请求

4.Redis 如何使用 Lua 脚本

从 Redis 2.6 版本开始,Redis 内置了 Lua 解释器,并提供了 eval 命令来解析 Lua 脚本,即允许开发者编写 Lua 脚本传到 Redis 中执行。

Lua 脚本功能为 Redis 开发和运维人员带来的 3 个好处:

  1. Lua 脚本在 Redis 中是原子执行的,执行过程中不会插入其它命令
  2. Lua 脚本可以帮助开发和运维人员创造出自己定制的命令,并可以将这些命令常驻在 Redis 内存中,实现复用的效果
  3. Lua 脚本可以将多条命令一次性打包,有效减少网络开销

接下来我们看看如何使用 Redis 来执行 Lua 脚本?

首先我们要看看 eval 的使用:

EVAL script numkeys key [key ...] arg [arg ...]//script:lua 脚本
//numkeys:key 的个数
//key:键名参数集,通过全局变量 KEYS 数组表示,起始下标为 1
//arg:键值参数集,通过全局变量 ARGV 数组表示,起始下标为 1

这样说,大家可能还是不太清楚是怎么一回事,我们看看一个例子:
在这里插入图片描述
通常情况下,我们不会直接在 redis-cli 中写 lua 脚本,这样非常不方便编辑,通过我们都是把 lua 脚本写到一个 lua 文件中,然后在 Redis 中执行这个 Lua 脚本,如:
在这里插入图片描述
然后我们通过下面命令执行,这种方式和前面介绍的不一样,参数 --eval script key1 key2,arg1 age2 这种模式,key 和 value 用一个逗号隔开就好了。
在这里插入图片描述
我们实战一下,如:通过 Lua 脚本获取指定的 key 的 List 中的所有数据?

新建 1.lua 脚本,如下:
在这里插入图片描述
这里的 redis.call 就是用来执行 redis 中 list 的 lrange 命令,接下来通过 lpush 给 person 塞入 3 条数据,如下:
在这里插入图片描述
然后我们来执行这个 Lua 脚本,效果如下图:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/eocuDE4m.shtml

相关文章

Android上实现高并发,可延迟处理

目录 1.Thread和线程池优缺点对比 1.1使用Thread 1.2使用线程池 2.实现Android高并发,可延迟处理的解决方案 2.1为什么不推荐无限制创建Thread执行 2.2实现多线程并发处理解决方案 2.3具体实现如下: 2.4模拟测试多线程并发及延迟执行 1.Thread和线…

01 Nginx的高并发处理

文章目录 Nginx的高并发处理1.为什么需要Nginx?2.Nginx概述2.1 Nginx介绍2.2 Nginx和apache的优缺点2.2.1 Nginx相对于apache的优点2.2.2 apache相对于Nginx的优点2.2.3 Tengine介绍 3. Nginx的下载与安装3.1 Nginx下载3.2 Nginx的源码安装3.2.1 安装前的准备工作3.…

浅谈 高并发 处理方案

愿打开此篇对你有所帮助。 文章目录 高性能开发十大必须掌握的核心技术I/O优化:零拷贝技术I/O优化:多路复用技术线程池技术无锁编程技术进程间通信技术 Scale-out(横向拓展)缓存异步高性能、高可用、高拓展 解决方案❇ 高性能的实…

分布式架构 高并发处理

分布式架构 高并发处理 高并发介绍 在同时或者极短时间内,有大量请求到达服务端,每个请求都需要服务端耗费资源进行处理,并做出相应反馈服务端比如同时开启进程数,能同时运行的线程数、网络连接数、CPU运算、I/O、内存都是有限&am…

iis高并发处理三

使用.NET开发的Web应用程序部署到IIS上后,当有大量用户并发访问,用户在访问的时候可能会出现页面打开慢或无法打开的情况,那么从服务器上的IIS上我们可以做以下调整,让应用支持10万级以内的并发访问。 1、调整IIS 应用程序池队列…

前端优化之高并发处理

大部分的高并发处理基本都是在后端处理,但是在部分特殊情况下,后端无法阻止用户行为,需要前端做配合。例如在抢购、秒杀等场景。 高并发是什么? 对此,我们首先需要简单的去了解一下,高并发是什么&#xff1…

机器学习中的核函数与核方法(是什么?为什么?怎么做?)

我们在学习机器学习的时候,总是会看到一个概念——核,然后看到一堆公式。但是为什么要核呢?核到底是啥玩意?云里雾里。接下来,我们将要把“核”这个东西的神秘面纱一点点揭开。 一、什么是“核函数” 我们都知道&…

【Kernel Method】Kernel Method核方法介绍

引言 核方法是20世纪90年代模式识别与机器学习领域兴起的一场技术性革命。其优势在于允许研究者在原始数据对应的高维空间使用线性方法来分析和解决问题,且能有效地规避“ 维数灾难”。在模式识别的特征抽取领域,核方法最具特色之处在于其虽等价于先将原…

通俗理解核方法(kernel function)

最近对核方法比较有兴趣,想了解一下,在网上查阅了很多资料,感觉说的很晦涩,没有理解,于是查看了李政轩老师的课程,对其有了一定程度上的理解,本博客目的为了记录,也为了加深理解。 …

电机选型及校核方法总结

序:原先最初是没打算写电机选型总结的,而是准备写一些关于数字信号处理相关的东西,但是我的一个朋友提醒了我。他说,现在网上关于数字信号处理的东西写的太多了,特别是基础的知识都写烂了,你再写也没人看&a…

核方法与核技巧

本文对核方法(kernel method)进行简要的介绍。 核方法的主要思想是基于这样一个假设:“在低维空间中不能线性分割的点集,通过转化为高维空间中的点集时,很有可能变为线性可分的” ,例如下图 左图的两类数据…

机器学习中的核方法(Kernel Method)

说到机器学习中的核方法(Kernel Method),大部分人应该是在学习SVM的时候认识到它或者听说它。它的基本思想是说,普通的SVM分类超平面只能应对线性可分的情况,而对于线性不可分的情况我们则需要引入一个Kernel,这个Kernel可以把数据集从低维映射到高维,使得原来线性不可分…

支持向量机原理小结(3)——核方法和非线性支持向量机

前面两篇博客对线性支持向量机进行了详细的讲解,但线性SVM对于非线性的数据是无可奈何的。这篇博客将讲一下非线性支持向量机。 1. 核方法 对SVM有过一定耳闻的人,一定听说过“核技巧”、“核方法”这些名词,其实核方法并不是只能应用于SVM&…

核方法以及核函数讲解

核方法的主要思想是基于这样一个假设:“在低维空间中不能线性分割的点集,通过转化为高维空间中的点集时,很有可能变为线性可分的” ,例如下图 左图的两类数据要想在一维空间上线性分开是不可能的,然而通过F(x)(x-a)(x-…

MLAPP————第十四章 核方法

第十四章 核方法 14.1 简介 到目前为止,我们书上提到的各种方法,包括分类,聚类或者是其它的一些处理手段,我们的特征都是固定大小的一个向量,一般具有如下的形式,。然而,对于某些类型的对象&a…

核方法的理解

核方法在非线性分类问题上有很好的解决思路,应用于学习器SVM以及降维KPCA上,当然二者路径也不同,SVM就是从低维不可分映射到高维可分,而KPCA是从低维不可分映射到高维后再降维到低维可分,但都脱离不来这个核方法。 核…

核方法原理

核方法原理 1.无力的线性分类器 一般情况下,我们考虑构造一个线性分类器来解决问题。但是实际中,线性分类器的效果达不到要求,因为大部分数据都不是线性可分的,如下面这幅图。一种改进的方法是把多个弱的线性分类器组合得到一个强…

核方法(kernel method)的主要思想

kernel method是针对低维线性不可分而提出的一种解决方法,在PRML中有一章节的介绍,对其理解,也是迭代更进的过程。 简单来说,kernel method是一种低维和高维特征空间映射的方法,利用低维内积的函数来表征高维内积&…

python svm核函数_Python.SVM(三)核方法

Python.SVM(三)核方法 1 什么是核方法 往简单里说,核方法是将一个低维的线性不可分的数据映射到一个高维的空间、并期望映射后的数据在高维空间里是线性可分的。 我们以异或数据集为例:在二维空间中、异或数据集是线性不可分的;但是通过将其映…

核方法回归

参考论文-DENSITY ESTIMATION FOR STATISTICS AND DATA ANALYSIS 给定数据集,来估计概率密度函数 Histograms The naive estimator 也是分成段的平行x轴直线连接起来 The kernel estimator 其中kernel可以是高斯核,结果图: 可以见到,高斯核…