Redis LUA基本使用

EVAL LUA

redis.call

  1. 通过EVAL指令,使用 redis.call 执行LUA脚本,3指定的是,前三个参数是KEYS的,然后后面的是ARGV的。
  2. 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

  1. redis.call 在遇到异常之后,不会继续往后执行。
  2. 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服务器上,还可以防止脚本暴露在程序中被篡改。

  1. 可以通过 SCRIPT LOAD 指令将LUA脚本缓存到服务端,服务端返回一个RSA加密后的串。
  2. 执行时,通过 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
释放