《Redis使用手册之Lua脚本》
EVAL:执行脚本
-
127.0.0.1:6379> eval “return ‘hello world’” 0
“hello world”127.0.0.1:6379> eval “return redis.call(‘set’,KEYS[1],ARGV[1])” 1 “message” “hello world”
OK
127.0.0.1:6379> get message
“hello world”EVAL:执行脚本
EVAL script numkeys key [key …] arg [arg …]
script参数用于传递脚本本身。
numkeys参数用于指定脚本需要处理的键数量,根据Lua的惯例,
KEYS数组的索引将以1为开始:访问KEYS[1]可以取得第一个传入的key参数,访问KEYS[2]可以取得第二个传入的key参数,以此类推。 任意多个arg参数用于指定传递给脚本的附加参数,这些脚本可以在脚本中通过ARGV数组进行访问,与KEYS参数一样,ARGV数组的索引也是以1为开始的。
使用脚本执行Redis命令
redis.call(command, …)
redis.pcall(command, …)
这两个函数接受的第一个参数都是被执行的Redis命令的名字,而后面跟着的则是任意多个命令参数。
在lua脚本中执行Redis命令所使用的格式与redis-cli客户端中执行Redis命令所使用的格式是完全一样的。
EVAL:执行脚本
SCRIPT LOAD和EVALSHA:缓存并执行脚本
-
127.0.0.1:6379> script load “return ‘hello world’”
“5332031c6b470dc5a0dd9b4bf2030dea6d65de91”
127.0.0.1:6379> script load “redis.call(‘SET’,KEYS[1],ARGV[1]); return redis.call(‘GET’,KEYS[1])”
“27f72464d4122016431244ae33526a5fb72014f3”
127.0.0.1:6379> evalsha “5332031c6b470dc5a0dd9b4bf2030dea6d65de91” 0
“hello world”
127.0.0.1:6379> evalsha “27f72464d4122016431244ae33526a5fb72014f3” 1 “msg”127.0.0.1:6379> evalsha “27f72464d4122016431244ae33526a5fb72014f3” 1 “msg” “Ciao!”
“Ciao!”
127.0.0.1:6379> script exists 27f72464d4122016431244ae33526a5fb72014f3 5332031c6b470dc5a0dd9b4bf2030dea6d65de91(integer) 1
(integer) 1
127.0.0.1:6379> script flush
OK
127.0.0.1:6379> script exists 27f72464d4122016431244ae33526a5fb72014f3 5332031c6b470dc5a0dd9b4bf2030dea6d65de91(integer) 0
(integer) 0
127.0.0.1:6379> script killSCRIPT LOAD和EVALSHA:缓存并执行脚本
SCRIPT LOAD script
用户通过EVALSHA命令来执行已被缓存的脚本
EVALSHA sha1 numkeys key[key …] arg[arg …]
除了第一个参数接受的事Lua脚本对应的SHA1校验和而不是脚本本身之外,EVALSHA命令的其他参数与EVAL命令的参数都是相同的。
除了SCRIPT LOAD之外,EVAL命令在执行完脚本之后也会把被执行的脚本缓存起来,以供之后使用。
通过Lua脚本缓存,我们可以将需要重复执行的Lua脚本缓存在服务器中,然后通过EVALSHA命令来执行已缓存的脚本,从而将执行Lua脚本所需耗费的网络带宽降至最低。
SCRIPT LOAD和EVALSHA:缓存并执行脚本