当前位置:嗨网首页>书籍在线阅读

12-脚本相关命令

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.3.3 脚本相关命令

1. EVAL 命令

编写完脚本后最重要的就是在程序中执行脚本。Redis提供了 EVAL 命令可以使开发者像调用其他Redis内置命令一样调用脚本。 EVAL 命令的格式是: EVAL 脚本内容 key 参数的数量 [key …] [arg …] 。可以通过 keyarg 这两类参数向脚本传递数据,它们的值可以在脚本中分别使用 KEYSARGV 两个表类型的全局变量访问。比如希望用脚本功能实现一个 SET 命令(当然现实中我们不会这么干),脚本内容是这样的:

return redis.call('SET', KEYS[1], ARGV[1])

现在打开redis-cli执行此脚本:

redis> EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar
OK
redis> GET foo
"bar"

其中要读写的键名应该作为 key 参数,其他的数据都作为 arg 参数。具体的原因会在6-4节中介绍。

注意

EVAL 命令依据第二个参数将后面的所有参数分别存入脚本中 KEYSARGV 两个表类型的全局变量。当脚本不需要任何参数时也不能省略这个参数(设为0)。

2 .** EVALSHA**命令

考虑到在脚本比较长的情况下,如果每次调用脚本都需要将整个脚本传给Redis会占用较多的带宽。为了解决这个问题,Redis提供了 EVALSHA 命令允许开发者通过脚本内容的SHA1摘要来执行脚本,该命令的用法和 EVAL 一样,只不过是将脚本内容替换成脚本内容的 SHA1摘要。

Redis在执行 EVAL 命令时会计算脚本的SHA1摘要并记录在脚本缓存中,执行 EVALSHA 命令时Redis会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则会返回错误:“NOSCRIPT No matching script. Please use EVAL.”

在程序中使用 EVALSHA 命令的一般流程如下。

(1)先计算脚本的SHA1摘要,并使用 EVALSHA 命令执行脚本。

(2)获得返回值,如果返回“NOSCRIPT”错误则使用 EVAL 命令重新执行脚本。

虽然这一流程略显麻烦,但值得庆幸的是很多编程语言的Redis客户端都会代替开发者完成这一流程。比如使用node_redis客户端执行 EVAL 命令时,node_redis会先尝试执行 EVALSHA 命令,如果失败了才会执行 EVAL 命令。