自2.6.0起可用
EVAL 和 EVALSHA 用于从版本2.6.0开始使用内置在 Redis 中的Lua解析器,用来执行一段lua脚本,对 Lua进行求值。
EVAL每次都需要将完整的lua脚本传递给redis服务器。
EVAL命令的实现
EVAL 命令的执行过程可以分为以下三个步骤:
- 根据客户端给定的 Lua 脚本,在 Lua 环境中定义一个 Lua函数
- 将客户端给定的脚本保存到 lua_scripts 字典,等待将来进一步使用
- 执行刚刚在 Lua 环境定义的函数,以此来执行客户端执行的 Lua 脚本。
Redisson 实现的客户端对Lua脚本进行了什么优化?
参数 : useScriptCache Default value: false
定义是否在Redis端使用Lua脚本缓存。大多数Redisson方法都是基于Lua脚本的, 打开此设置可以提高此类方法的执行速度并节省网络流量。
思路:
- 先把命令转换成 sha1码
- 然后执行一遍 “EVALSHA” 命令,监听命令返回命令
- 返回 “NOSCRIPT” 就是证明该 Redis服务端没有这个脚本了,执行一遍 “SCRIPT_LOAD” 命令,把脚本load进去,继续监听 “SCRIPT_LOAD” 命令的返回
- “SCRIPT_LOAD”命令返回成功就再发一次 “EVALSHA” 命令
生产环境中,推荐使用EVALSHA
,相较于EVAL
的每次发送脚本主体、浪费带宽,会更高效。这里要注意SCRIPT KILL
,杀死正在运行脚本的时候,如果脚本执行过写操作了,这里会杀死失败,因为这违反了 redis lua 脚本的原子性。