redis eval

参考文档:
http://redisdoc.com/script/script_kill.html

一、EVAL命令
1、
从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值。
示例:

127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

 

eval:执行lua脚本的命令
"return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}":lua脚本内容,KEYS[x]是键盘参数,ARGV[x]是附加参数
2:指定KEYS键的数量
key1 key2:参数值
first second:附加参数值

注意:指定KEY键数量之后的都是附加参数值,ARGV[1]指第一个附加参数值,ARGV[2]指第二个附加参数值。

例:

127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 3 key1 key2 first second
1) "key1"
2) "key2"
3) "second"

 

指定KEYS占位符3个,则key1 key2 first分别对应着KEYS[1] KEYS[2] KEYS[3]
secondary 是第一个附加参数值
所以只能打印出key1 key2 second

redis eval


2、
在 Lua 脚本中,可以使用两个不同函数来执行 Redis 命令,它们分别是:
redis.call()
redis.pcall()
示例:

127.0.0.1:6379> eval "return redis.call('set','foo','bar')" 0
OK
127.0.0.1:6379> eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK

 

唯一的区别是
当 redis.call() 在执行命令的过程中发生错误时,脚本会停止执行,并返回一个脚本错误,错误的输出信息会说明错误造成的原因。
redis.pcall() 出错时并不引发(raise)错误,而是返回一个带 err 域的 Lua 表(table),用于表示错误。

3、
在redis-cli命令中行直接执行lua脚本

root@ip-172-31-30-45:~# cat test.lua
local name=KEYS[1]
return "hello "..name.."!"
root@ip-172-31-30-45:~# redis-cli --eval test.lua nihao
"hello nihao!"

 

4、更多示例:

127.0.0.1:6379> eval 'local name=KEYS[1] return "hello "..name.."!"' 1 nihao
"hello nihao!"

 

二、EVALSHA命令:
根据给定的 sha1 校验码,对缓存在服务器中的脚本进行求值,将脚本缓存到服务器的操作可以通过 SCRIPT LOAD script 命令进行。
sha1 校验码在使用【SCRIPT LOAD script】命令加载脚本时会得到。
示例:

127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
"232fd51614574cf0867b83d384a5e898cfd24e5a"
127.0.0.1:6379> EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
"hello moto"

 

三、SCRIPT LOAD
1、直接在redis命令行中加载脚本
示例:

127.0.0.1:6379> script load "return {KEYS[1]}"
"8e5266f6a4373624739bd44187744618bc810de3"
127.0.0.1:6379> evalsha 8e5266f6a4373624739bd44187744618bc810de3 1 abc
1) "abc"

 


四、SCRIPT EXISTS
根据sha1值,检测lua脚本是否被缓存到了内存中,
如果在内存中则返回1,如果不在则返回0

127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
"232fd51614574cf0867b83d384a5e898cfd24e5a"
127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 1
127.0.0.1:6379> SCRIPT FLUSH
OK
127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 0

 

五、SCRIPT FLUSH
清空所有lua脚本缓存

127.0.0.1:6379> SCRIPT FLUSH
OK

 

六、SCRIPT KILL
杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。

session1:
EVAL "while true do end" 0

session2:
redis> SCRIPT KILL
OK
redis> 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.

 

上一篇:shell中的eval命令


下一篇:学习python小结:循环结构及之前的知识补充