EVAL#
- 从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值。
- script 参数是一段 Lua 5.1 脚本程序,它会被运行在 Redis 服务器上下文中,这段脚本不必(也不应该)定义为一个 Lua 函数。
- numkeys 参数用于指定键名参数的个数。
- 语法:
EVAL script numkeys [key [key ...]] [arg [arg ...]]
- 示例:
$ EVAL "return ARGV[1]" 0 hello
"hello"
$ eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
EVAL_RO#
- 这是 EVAL 命令的只读变体,无法执行修改数据的命令。
- 语法:
EVAL_RO script numkeys [key [key ...]] [arg [arg ...]]
- 使用示例:
$ SET mykey "Hello"
OK
$ EVAL_RO "return redis.call('GET', KEYS[1])" 1 mykey
"Hello"
$ EVAL_RO "return redis.call('DEL', KEYS[1])" 1 mykey
(error) ERR Error running script (call to b0d697da25b13e49157b2c214a4033546aba2104): @user_script:1: @user_script: 1: Write commands are not allowed from read-only scripts.
EVALSHA#
- 服务器使用 SCRIPT LOAD 命令缓存脚本。该命令在其他方面与 EVAL 相同。
- 语法:
EVALSHA sha1 numkeys [key [key ...]] [arg [arg ...]]
- 使用示例:
$ SCRIPT LOAD "return 'hello moto'"
"232fd51614574cf0867b83d384a5e898cfd24e5a"
$ EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
"hello moto"
EVALSHA_RO#
- 这是 EVALSHA 命令的只读变体,无法执行修改数据的命令。
- 语法:
EVALSHA_RO sha1 numkeys [key [key ...]] [arg [arg ...]]
SCRIPT LOAD#
- 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。
- EVAL 命令也会将脚本添加到脚本缓存中,但是它会立即对输入的脚本进行求值。
- 如果给定的脚本已经在缓存里面了,那么不做动作。
- 在脚本被加入到缓存之后,通过 EVALSHA 命令,可以使用脚本的 SHA1 校验和来调用这个脚本。
- 脚本可以在缓存中保留无限长的时间,直到执行 SCRIPT FLUSH 为止。
- 语法:
- 使用示例:
$ SCRIPT LOAD "return 'hello moto'"
"232fd51614574cf0867b83d384a5e898cfd24e5a"
$ EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
"hello moto"
SCRIPT EXISTS#
- 给定一个或多个脚本的 SHA1 校验和,返回一个包含 0 和 1 的列表,表示校验和所指定的脚本是否已经被保存在缓存当中。
- 返回值:一个列表,包含 0 和 1 ,前者表示脚本不存在于缓存,后者表示脚本已经在缓存里面了。
- 语法:
SCRIPT EXISTS sha1 [sha1 ...]
- 使用示例:
$ SCRIPT LOAD "return 'hello moto'" # 载入一个脚本
"232fd51614574cf0867b83d384a5e898cfd24e5a"
$ SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 1
$ SCRIPT FLUSH # 清空缓存
OK
$ SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 0
SCRIPT FLUSH#
- 清除所有 Lua 脚本缓存。
- 语法:
SCRIPT FLUSH [ASYNC | SYNC]
- 使用示例:
SCRIPT KILL#
- 杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。
- 这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限 loop 的脚本,诸如此类。
- SCRIPT KILL 执行之后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从 EVAL 命令的阻塞当中退出,并收到一个错误作为返回值。
- 语法:
- 使用示例:
# 没有脚本在执行时
$ SCRIPT KILL
(error) ERR No scripts in execution right now.
# 成功杀死脚本时
$ SCRIPT KILL
OK
(1.30s)
# 尝试杀死一个已经执行过写操作的脚本,失败
$ SCRIPT KILL
(error) ERR Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in an hard way using the SHUTDOWN NOSAVE command.
(1.69s)