重点回顾

  • 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 nosave 命令来让钩子关闭整个服务器。
  • 主服务器复制 EVAL 、 SCRIPT_FLUSH 、 SCRIPT_LOAD 三个命令的方法和复制普通 Redis 命令一样 ——只要将相同的命令传播给从服务器就可以了。
  • 主服务器在复制 EVALSHA 命令时,必须确保所有从服务器都已经载入了 EVALSHA 命令指定的 SHA1 校验和所对应的 Lua 脚本,如果不能确保这一点的话,主服务器会将 EVALSHA 命令转换成等效的 EVAL 命令,并通过传播 EVAL 命令来获得相同的脚本执行效果。