继《Redis设计与实现》第二十章总结一:Lua脚本之总述
EVAL命令的执行分为三个步骤: 接下来详细介绍三个步骤,以EVAL “return ‘hello world’” 0为例
为传入的脚本定义一个与这个脚本相对应的Lua函数
函数名字由f_前缀加上脚本的SHA1校验和组成,函数体则是脚本本身
例子: 使用函数来保存脚本的好处:
将脚本保存到服务器的lua_scripts字典里面
服务器进行一些设置钩子、传入参数之类的准备动作,然后正式开始执行脚本:
其原理与20.3.1中使用函数来保存脚本有关:
用于清除服务器中所有和Lua脚本有关的信息,即释放并重建lua_scripts字典,关闭现有的Lua环境并重建一个新的Lua环境
伪代码:
根据输入的SHA1校验和,检查校验和对应的脚本是否存在于服务器中
伪代码:检查给定的校验和是否存在于lua_scripts字典中的键
跟EVAL命令的前两步一样:为脚本创建函数,再将脚本保存到lua_scripts字典里面
完成这两步,客户端就可以使用EVALSHA命令来执行已载入的脚本了
关于处理钩子和lua-time-limit: 带有超时处理钩子的脚本的执行过程: 如果超时运行的脚本未执行过任何写入操作,那么客户端可以通过SCRIPT KILL命令来指示服务器停止执行这个脚本,给客户端返回一个错误回复;服务器可以继续运行 如果执行过写入操作,则只能使用SHUTDOWN nosave命令来停止服务器,从而防止不合法的数据被写入数据库