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命令来停止服务器,从而防止不合法的数据被写入数据库