沃梦达 / IT编程 / 数据库 / 正文

Redis EVALSHA命令

Redis的EVALSHA命令是一个用来执行Lua脚本的命令。相比于EVAL命令,EVALSHA命令的执行速度更快,且可以避免在脚本较长时因为传输脚本内容而导致的网络延迟。

Redis的EVALSHA命令是一个用来执行Lua脚本的命令。相比于EVAL命令,EVALSHA命令的执行速度更快,且可以避免在脚本较长时因为传输脚本内容而导致的网络延迟。

使用方法

EVALSHA命令的语法如下:

EVALSHA script_sha1 numkeys key [key ...] arg [arg ...]

其中,script_sha1是指已经在Redis缓存中保存的Lua脚本的sha1值,numkeys代表脚本中使用到的key的个数,key是被Lua脚本使用到的键名,arg是传入到Lua脚本中使用的值。

实例说明

实例1:

假设我们有一个Lua脚本,在Redis的缓存中的sha1值为"926f32424d69b205b297296e4f7f3361d011d185",脚本内容如下:

local name = KEYS[1] 
local age = ARGV[1] 
redis.call('SET', name, age) 
return redis.call('GET', name)

接下来快速运行一下上述脚本,将值写入缓存中:

> EVAL "local name = 'Tom' local age = 20 redis.call('SET', name, age) return redis.call('GET', name)" 0

接下来我们可以使用EVALSHA命令来实现同样的逻辑:

> EVALSHA "926f32424d69b205b297296e4f7f3361d011d185" 1 Tom 20

经过测试,两个命令都可以正确地将值写入缓存中。

实例2:

继续考虑另一个Lua脚本,脚本内容如下:

if tonumber(redis.call('GET', KEYS[1])) > tonumber(ARGV[1])
then
    redis.call('SET', KEYS[1], ARGV[1]) 
    return 1
else
    return 0 
end

基于以上脚本内容,我们可以使用EVALSHA命令来实现原来的脚本内容,而不用再次传输完整的脚本内容:

> EVALSHA "3618e63f85c0421efb015067f99b1d528ec7be50" 1 test 10
(integer) 1
> EVALSHA "3618e63f85c0421efb015067f99b1d528ec7be50" 1 test 11
(integer) 0

以上命令分别比较test的值,如果值为10,则将其更新为11,并返回1;否则返回0。这在Redis缓存中的使用场景比较多见。

本文标题为:Redis EVALSHA命令

上一篇: Redis EXEC命令
下一篇: Redis PEXPIREAT命令