redis调用lua脚本
在实际开发中,可以通过pipeline将多个命令批量传输给redis执行,减少网络开销;但有时候,由于执行的命令可能依赖前一命令的结果,在这种情况下,pipeline就不能满足我们的要求;
幸运的是redis中内置了对lua的支持,可以通过lua脚本完成此类工作;
调用方式
1. redis-cli --eval script key_count key1,key2...arg1 argn
2. redis-cli --evalsha scriptsha key_count key1,key2...arg1 argn
3. redis-cli eval "$(cat script.lua)" key_count key1,key2...arg1 arg2
参数说明
- key_count表示key参数的个数,在lua脚本中,可以通过
KEYS+下标
的方式引用; - argn表示参数,在lua脚本中可以通过
ARGV+下标
的方式引用;
例子
1.lua
local result=0
local id= redis.call('get',KEYS[1])
if id then
result= redis.call('sismember',id,KEYS[2])
end
if result==1 then
redis.call('expire',KEYS[1],ARGV[1])
end
return result
redis-cli --eval 1.lua 2 user1 user:list 1800
或
redis-cli eval "$(1.lua)" 2 user1 user:list 1800
或
redis-cli script load "$(cat 1.lua)"
redis-cli evalsha 2cfe726fe60678e8ed4d689a3e98727d1e1e2339 1 test 1
注:2cfe726fe60678e8ed4d689a3e98727d1e1e2339是script load产生的sha值;如果redis需要认证,可以通过-a参数
脚本调试
redis3.2之后内置了debug引擎,可以通过--ldb选项进入debug模式
redis-cli --ldb evalsha 2cfe726fe60678e8ed4d689a3e98727d1e1e2339 1 test 1
Paste_Image.png
网友评论