12-脚本相关命令
6.3.3 脚本相关命令
1. EVAL
命令
编写完脚本后最重要的就是在程序中执行脚本。Redis提供了 EVAL
命令可以使开发者像调用其他Redis内置命令一样调用脚本。 EVAL
命令的格式是: EVAL
脚本内容 key
参数的数量 [key …] [arg …]
。可以通过 key
和 arg
这两类参数向脚本传递数据,它们的值可以在脚本中分别使用 KEYS
和 ARGV
两个表类型的全局变量访问。比如希望用脚本功能实现一个 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
命令依据第二个参数将后面的所有参数分别存入脚本中KEYS
和ARGV
两个表类型的全局变量。当脚本不需要任何参数时也不能省略这个参数(设为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
命令。