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