Redis中的Lua脚本(三)

news2024/11/15 13:57:32

Lua脚本

EVAL命令的实现

EVAL命令的执行过程可以分为以下三个步骤:

  • 1.根据客户端给定的Lua脚本,在Lua环境中定义一个Lua函数
  • 2.将客户端给定的脚本保存到lua_scripts字典,等待将来进一步使用
  • 3.执行刚刚在Lua环境中定义的函数,以此来执行客户端给定的Lua脚本
    以下命令作为示例,分别介绍EVAL命令执行的三个步骤:
127.0.0.1:6379> EVAL "return 'hello world'" 0
"hello world"

定义脚本函数

当客户端向服务器发送EVAL命令,要求执行某个Lua脚本的时候,服务器首先要做的就是在Lua环境中,为传入的脚本定义一个与这个脚本相对应的Lua函数,其中,Lua函数的名字由f_前缀加上脚本的SHA1校验和(四十个字符长)组成,而函数的体(body)则是脚本本身

使用函数来保存客户端传入的脚本有以下好处:

  • 1.执行脚本的步骤非常简单,只要调用与脚本相对应的函数即可
  • 2.通过函数的局部性来让Lua环境保持清洁,减少了垃圾回收的工作量,并且避免了使用全局变量
  • 3.如果某个脚本所对应的函数在Lua环境中被定义过至少一次,那么只要记得这个脚本的SHA1校验和,服务器就可以在不知道脚本本身的情况下,直接通过调用Lua函数来执行脚本,这时EVALSHA命令的实现原理
例子
  • 举个例子,对于命令:
EVAL "return 'hello world'" 0

来说,服务器将在Lua环境中定义以下函数:

function f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91()
return 'hello world'
end

因为客户端传入的脚本为return ‘hello world’,而这个脚本的SHA1校验和为5332031c6b470dc5a0dd9b4bf2030dea6d65de91所以函数的名字为f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91,而函数的体则为return ‘hello world’.

将脚本保存到lua_scripts字典

EVAL命令要做的第二件事是将客户端传入的脚本保存到服务器的lua_scripts字典里面。
在这里插入图片描述

例子
  • 举个例子,对于命令:
EVAL "return 'hello world'" 0

来说,服务器将在lua_scripts字典中新添加一个键值对,其中键为Lua脚本的SHA1校验和

5332031c6b470dc5a0dd9b4bf2030dea6d65de91

而值则为Lua脚本本身:

retuern 'hello world'

添加新键值对之后,lua_scripts字典如上图所示:

执行脚本函数

在为脚本定义函数,并且将脚本保存到lua_scripts字典之后,服务器还需要进行一些设置钩子、传入参数之类的准备动作,才能正式开始执行脚本。整个准备和执行脚本的过程如下:

  • 1.将EVAL命令中传入的键名(key name)参数和脚本参数分别保存到KEYS数组和ARGV数组,然后将这两个数组作为全局变量传入到Lua环境里面
  • 2.为Lua环境装载超时处理钩子(hook),这个钩子可以在脚本出现超时运行情况是,让客户端通过SCRIPT KILL命令停止脚本,或者通过SHUTDOWN命令直接关闭服务器
  • 3.执行脚本函数
  • 4.移除之前装载的超时钩子
  • 5.将执行脚本函数所得的结果保存到客户端状态的输出缓冲区里面,等待服务器将结果返回给客户端
例子
  • 举个例子。对于如下命令:
EVAL "return 'hello world'" 0

服务器将执行以下动作:
1.因为这个脚本没有给定任何键名参数或者脚本参数,所以服务器会跳过传值到KEYS数组或ARGV数组这一步
2.为Lua胡娜经装载超时处理钩子
3.在Lua环境中执行f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91函数
4.移除超时钩子
5.将执行f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91函数所得的结果"hello world"保存到客户端状态的输出缓冲区里面
6.对Lua环境执行垃圾回收操作
至此,命令:

EVAL "return 'hello world'" 0

执行算是完成了,之后服务器只要将保存在输出缓冲区里面的执行结果返回给执行EVAL命令的客户端就可以了

EVALSHA命令的实现

每个被EVAL命令成功执行过的Lua脚本,在Lua环境里面都有一个与这个脚本相对应的Lua函数,函数的名字由f_前缀加上40个字符串的SHA1校验和组成,例如f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91.只要脚本对应的函数曾经在Lua环境里面定义过,那么即使不知道脚本的内容本身,客户端也可以根据脚本的SHA1校验和来调用脚本对应的函数,从而达到执行脚本的目的,这就是EVALSHA命令的实现原理。

伪代码描述

def EVALSHA(sha1):
# 拼接出函数的名字
# 例如 f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91
func_name = "f_" + sha1

# 查看这个函数在Lua环境中是否存在
if function_exists_in_lua_env(func_name):
# 如果函数存在,那么执行它
execute_lua_function(func_name)
else:
# 如果函数不存在,那么返回一个错误
send_scirpt_error("SCRIPT NOT FOUND")

例子

  • 举个例子。当服务器执行完以下EVAL命令之后:
127.0.0.1:6379> EVAL "return 'hello world'" 0
"hello world"

Lua环境里面就定义了以下函数:

function f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91()
return 'hello world'
end

当客户端执行以下EVALSHA命令时:

127.0.0.1:6379> EVALSHA 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
"hello world"

服务器首先根据客户端输入的SHA1校验和,检查函数f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91
是否存在于Lua环境中,得到的回应时该函数确实存在,于是服务器执行Lua环境中的f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91函数,并将结果"hello world"返回给客户端

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

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

相关文章

从 CodeGemma 到 CodeQwen1.5:开源编程大模型百家争鸣

笔者最近刚刚试用完 CodeGemma ,准备分享我的心得时,通义千问的 CodeQwen1.5 就也悄然发布。本文主要介绍 CodeQwen1.5 这款开源编程大模型,并展示如何在 VSCode 中使用它帮你提升编程体验。 1. 开源编程大模型的必要性 大型语言模型&#x…

python爬虫 - 爬取图片

文章目录 1、爬取图片示例1:使用 .urlretrieve() 函数2、爬取图片示例2 - 使用 open/write 函数3、爬取图片示例33.1 使用 open/write 下载3.2 使用 urlretrieve下载 爬虫的本质:模拟对应的App,浏览器访问对应的地址获取到数据 1、爬取图片示…

光伏工程施工前踏勘方案与注意事项

光伏工程是指利用光能发电的技术。随着清洁能源的发展,光伏工程在能源领域的应用越来越广泛。在进行光伏工程施工前,需要对施工现场进行踏勘,以确保施工能够顺利进行并达到预期的效果。 本文游小编带大家一起看一下探勘的方案和注意事项。 1…

LY-UV冲击试样缺口液压拉床

性能说明:该系列拉床专用于精确加工冲击试样的V型和U型缺口,试样加工过程全自动操作。是冶金、锅炉压力容器、车船和机械制造等行业理化试验室的理想冲击辅助设备。 该拉床具有操作简单、快速高效、一次成型且缺口标准统一的特点,完全满足GB…

用html写一个搜索页面

<!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>搜索框设计</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class"se…

第 393 场周赛

100256. 替换字符可以得到的最晚时间 给你一个字符串 s&#xff0c;表示一个 12 小时制的时间格式&#xff0c;其中一些数字&#xff08;可能没有&#xff09;被 "?" 替换。 12 小时制时间格式为 "HH:MM" &#xff0c;其中 HH 的取值范围为 00 至 11&am…

VBA技术资料MF143:将PowerPoint中幻灯片导出为图片

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【Qt 学习笔记】Qt常用控件 | 显示类控件Progress Bar的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件Progress Bar的使用及说明 文章编号&#xff…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

SAP HCM 离职是1号 正确计算免税金额

员工是1号离职&#xff0c;如何正确计算个税中的免税金额&#xff0c;例如员工2024年3月1日离职&#xff0c;现在计算2月的工资&#xff0c;因为是下发薪所以&#xff0c;12月、1月、2月是三个月&#xff0c;3*500015000&#xff0c;但是系统计只有10000. 如果要计算出三个月&a…

(CVPR,2024)CAT-Seg:基于成本聚合的开放词汇语义分割

文章目录 摘要引言方法计算成本与嵌入空间成本聚合类别成本聚合CAT-Seg框架 实验 摘要 开放词汇的语义分割面临着根据各种文本描述对图像中的每个像素进行标记的挑战。在这项工作中&#xff0c;我们引入了一种新颖的基于成本的方法&#xff0c;以适应视觉语言基础模型&#xf…

【算法】反转链表

本题来源---《反转链表》 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输…

ansible模块实战-部署rsync服务端

目录 1、根据部署流程所用到的命令找出模块 2.实战部署 2.1 服务部署&#xff1a;yum 安装 2.2 准备好rsync服务的配置文件 &#xff0c;并将配置文件通过copy模块分发给192.168.81.136这台受控主机 2.3 创建虚拟机用户 2.4 创建密码文件和改权限 2.5 模块对应目录&…

大屏数字字体+渐变色

vue数据大屏使用数字字体_vue数字字体-CSDN博客 用css实现文字字体颜色渐变的三种方法_css 字体颜色渐变-CSDN博客

Java内存模型和 JVM 内存运行时

文章目录 前言一、什么是Java 的内存模型&#xff1f;二、什么是 JVM 的运行时数据区Java8 之前和之后的区别JVM 内存模型JVM 内存区域JVM 内存垃圾回收JVM如何判断哪些对象不在存活&#xff1f;JVM运行过程中如何判断哪些对象是垃圾&#xff1f; JVM 垃圾回收Java8 中的 jvm如…

Codeforces Round 924 (Div. 2) ---- F. Digital Patterns ---- 题解

F. Digital Patterns&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 要求在一个方块中&#xff0c;任意相邻的方块中他的透明度系数不能相同&#xff0c;这样的方块称为趣味性方块&#xff0c;问这样的方块有多少种。 那么我们可以相当&#xff0c;假设 a1 a2, 那…

Day 17 计划任务

计划任务&#xff1a;在约定好的时间完成计划好的工作 一次性计划任务&#xff1a;at ①安装一次性计划任务at&#xff1a;yum -y install at ②启动at服务&#xff1a;systemctl start atd 使用at命令 at 执行任务的时间 at> 写入需要执行的命令 at> ...... …

数字营销:细分-目标-定位(STP)模式——如何实现精准营销

细分-目标-定位&#xff08;STP&#xff09;模型是最广为人知的营销策略之一。作为营销人员&#xff0c;我们倾向于追逐新鲜事物&#xff0c;总是追求最新、最闪亮的营销技术&#xff0c;并为自己领先于趋势而感到自豪。与内容营销相结合&#xff0c;STP模式仍然是简化营销运作…

Linux http协议与实现http服务器

目录 一、HTTP与URL 1、HTTP协议 2、URL 3、URL编码 4、报文与报头 报文&#xff08;Message&#xff09; 报头&#xff08;Header&#xff09; 二、HTTP&#xff08;超文本传输协议&#xff09;的内部运作机理 请求部分&#xff1a; 响应部分&#xff1a; 三、实现…

聊聊binlog是什么

1. 上一讲思考題解答:redo日志刷盘策略的选择建议 先给大家解释一下上一讲的思考題&#xff0c;我给大家的一个建议&#xff0c;其实对于redo日志的三种刷盘策略&#xff0c;我们通常建议是设置为1 也就是说&#xff0c;提交事务的时候&#xff0c;redo日志必须是刷入磁盘文件…