Redis - Lua脚本
- Redis服务器在启动时,会对内嵌的Lua环境执行一系列修改操作,从而确保内嵌的Lua环境可以满足Redis在功能性、安全性等方面的要求。
- Redis服务器专门使用一个伪客户端来执行Lua脚本中包含的Redis命令。
- Redis使用脚本字典来保存所有被eval命令执行过,或者被script load命令载入过得lua脚本,这些脚本可以用于实现script exists命令,以及实现脚本复制功能。
- eval命令为客户端输入的脚本在lua环境中定义一个函数,并通过调用这个函数来执行脚本。
- evalsha命令通过直接调用lua环境中已经定义的函数来执行脚本。
- script flush命令会请客服务区lua_scripts字典中保存的脚本,并重置lua环境。
- script exists命令接收一个或多个SHA1校验和为参数,并通过检查lua_scripts字典来确认校验和对应的脚本是否存在。
- script load命令接收一个lua脚本为函数,为该脚本在lua环境中创建函数,并且脚本保存到lua_scripts字典中。
- 服务器在执行脚本之前,会为lua环境设置一个超时处理钩子,当脚本出现超时运行情况时,客户端可以通过向服务器发送script kill命令来让钩子停止正在执行的脚本,或者发送shutdown masave命令来钩子关闭整个服务器。
- 主服务器复制eval、script flush、script load 三个命令的方法和复制普通redis命令一样,只要将相同的命令传播给从服务器就可以。
- 主服务器在复制evalsha命令时,必须确保所有从服务器都已经载入了evalsha命令指定的sha1校验和所对应的lua脚本,如果不能确保这一点,主服务器会将evalsha命令转换成等效的eval命令,并通过传播eval命令来或得相同的脚本执行效果。