EVAL LUA
redis.call
- 通过EVAL指令,使用 redis.call 执行LUA脚本,3指定的是,前三个参数是KEYS的,然后后面的是ARGV的。
- LUA索引从1开始。
127.0.0.1:6379> EVAL "return redis.call(’SET', KEYS[2], ARGV[3])" 3 1 2 3 4 5 6
127.0.0.1:6379> get 2
"6"
[1 2 3]是KEYS的
[4 5 6]是ARGV的
redis.pcall
- redis.call 在遇到异常之后,不会继续往后执行。
- redis.pcall 可以捕获异常,如果没处理的话,将继续往后执行。
此处第一条语句报错,第二条语句将不会执行。
127.0.0.1:6379> EVAL "redis.call('SETRRRR', KEYS[1], ARGV[1]); redis.call('SET', KEYS[2], ARGV[2])" 2 a b c d e f g
(error) ERR Error running script (call to f_8a873e7e4125dc92ef97aa5e8b07e22f7d185183): @user_script:1: @user_script: 1: Unknown Redis command called from Lua script
127.0.0.1:6379> get b
(nil)
通过redis.pcall命令,对错误进行捕获后,会继续执行第二条语句。
127.0.0.1:6379> EVAL "redis.pcall('SETRRRR', KEYS[1], ARGV[1]); redis.call('SET', KEYS[2], ARGV[2])" 2 a b c d e f g
(nil)
127.0.0.1:6379> get b
"d"
SCRIPT
SCRIPT作用
在开发过程中,如果LUA脚本比较长,是会有一定的网络开销的。可以事先将LUA脚本缓存到redis服务器上,还可以防止脚本暴露在程序中被篡改。
- 可以通过
SCRIPT LOAD
指令将LUA脚本缓存到服务端,服务端返回一个RSA加密后的串。 - 执行时,通过
EVALSHA
执行RSA串
即可。
127.0.0.1:6379> SCRIPT LOAD "redis.call('SET', KEYS[1], ARGV[1])"
"fcd2612e1ca113b83fdfbc2a88493d3b231a32ad"
127.0.0.1:6379> EVALSHA fcd2612e1ca113b83fdfbc2a88493d3b231a32ad 2 a b c d e f g
(nil)
127.0.0.1:6379> get a
"c"
SCRIPT基础指令
SCRIPT EXISTS 检查是否存在脚本
127.0.0.1:6379> SCRIPT EXISTS fcd2612e1ca113b83fdfbc2a88493d3b231a32ad
1) (integer) 1
127.0.0.1:6379> SCRIPT EXISTS fcd2612e1ca113b83fdfbc2a88493d3b231a32adaaa
1) (integer) 0
SCRIPT FLUSH 清空所有脚本
127.0.0.1:6379> SCRIPT FLUSH
OK
127.0.0.1:6379> SCRIPT EXISTS fcd2612e1ca113b83fdfbc2a88493d3b231a32ad
1) (integer) 0
SCRIPT KILL 杀死当前正在运行的脚本
loop.lua
local i=0
while true
do
i=i+1
redis.debug(i)
end
return "OK"
redis-cli --eval loop.lua
进入锁死状态,开一个新窗口。所有指令都返回Redis服务器处于繁忙状态
通过KILL指令干掉当前正在执行的指令。
127.0.0.1:6379> SCRIPT KILL
OK