《Redis设计与实现》第二十章总结二:Lua脚本之命令实现

it2022-05-05  130

继《Redis设计与实现》第二十章总结一:Lua脚本之总述

20.3 EVAL命令的实现

EVAL命令的执行分为三个步骤: 接下来详细介绍三个步骤,以EVAL “return ‘hello world’” 0为例

20.3.1 定义脚本函数

为传入的脚本定义一个与这个脚本相对应的Lua函数

函数名字由f_前缀加上脚本的SHA1校验和组成,函数体则是脚本本身

例子: 使用函数来保存脚本的好处:

20.3.2 将脚本保存到lua_scripts字典

将脚本保存到服务器的lua_scripts字典里面

20.3.3 执行脚本函数

服务器进行一些设置钩子、传入参数之类的准备动作,然后正式开始执行脚本:

20.4 EVALSHA命令的实现

其原理与20.3.1中使用函数来保存脚本有关:

20.5 脚本管理命令的实现

20.5.1 SCRIPT FLUSH

用于清除服务器中所有和Lua脚本有关的信息,即释放并重建lua_scripts字典,关闭现有的Lua环境并重建一个新的Lua环境

伪代码:

20.5.2 SCRIPT EXISTS

根据输入的SHA1校验和,检查校验和对应的脚本是否存在于服务器中

伪代码:检查给定的校验和是否存在于lua_scripts字典中的键

20.5.3 SCRIPT LOAD

跟EVAL命令的前两步一样:为脚本创建函数,再将脚本保存到lua_scripts字典里面

完成这两步,客户端就可以使用EVALSHA命令来执行已载入的脚本了

20.5.4 SCRIPT KILL

关于处理钩子和lua-time-limit: 带有超时处理钩子的脚本的执行过程: 如果超时运行的脚本未执行过任何写入操作,那么客户端可以通过SCRIPT KILL命令来指示服务器停止执行这个脚本,给客户端返回一个错误回复;服务器可以继续运行 如果执行过写入操作,则只能使用SHUTDOWN nosave命令来停止服务器,从而防止不合法的数据被写入数据库


最新回复(0)