侧边栏壁纸
  • 累计撰写 2,046 篇文章
  • 累计创建 73 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

关于redis eval

大猿本猿
2022-01-03 / 1,144 阅读 / 0 字

自2.6.0起可用

EVAL 和 EVALSHA 用于从版本2.6.0开始使用内置在 Redis 中的Lua解析器,用来执行一段lua脚本,对 Lua进行求值。

EVAL每次都需要将完整的lua脚本传递给redis服务器。

EVAL命令的实现

EVAL 命令的执行过程可以分为以下三个步骤:

  1. 根据客户端给定的 Lua 脚本,在 Lua 环境中定义一个 Lua函数
  2. 将客户端给定的脚本保存到 lua_scripts 字典,等待将来进一步使用
  3. 执行刚刚在 Lua 环境定义的函数,以此来执行客户端执行的 Lua 脚本。

Redisson 实现的客户端对Lua脚本进行了什么优化?

参数 : useScriptCache Default value: false

定义是否在Redis端使用Lua脚本缓存。大多数Redisson方法都是基于Lua脚本的, 打开此设置可以提高此类方法的执行速度并节省网络流量。

思路:

  1. 先把命令转换成 sha1码
  2. 然后执行一遍 “EVALSHA” 命令,监听命令返回命令
  3. 返回 “NOSCRIPT” 就是证明该 Redis服务端没有这个脚本了,执行一遍 “SCRIPT_LOAD” 命令,把脚本load进去,继续监听 “SCRIPT_LOAD” 命令的返回
  4. “SCRIPT_LOAD”命令返回成功就再发一次 “EVALSHA” 命令

生产环境中,推荐使用EVALSHA,相较于EVAL的每次发送脚本主体、浪费带宽,会更高效。这里要注意SCRIPT KILL,杀死正在运行脚本的时候,如果脚本执行过写操作了,这里会杀死失败,因为这违反了 redis lua 脚本的原子性。