redis調(diào)用lua腳本
在實(shí)際開(kāi)發(fā)中芹务,可以通過(guò)pipeline將多個(gè)命令批量傳輸給redis執(zhí)行跌捆,減少網(wǎng)絡(luò)開(kāi)銷;但有時(shí)候叫倍,由于執(zhí)行的命令可能依賴前一命令的結(jié)果偷卧,在這種情況下,pipeline就不能滿足我們的要求段标;
幸運(yùn)的是redis中內(nèi)置了對(duì)lua的支持涯冠,可以通過(guò)lua腳本完成此類工作炉奴;
調(diào)用方式
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
參數(shù)說(shuō)明
- key_count表示key參數(shù)的個(gè)數(shù)逼庞,在lua腳本中,可以通過(guò)
KEYS+下標(biāo)
的方式引用; - argn表示參數(shù)瞻赶,在lua腳本中可以通過(guò)
ARGV+下標(biāo)
的方式引用;
例子
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產(chǎn)生的sha值赛糟;如果redis需要認(rèn)證,可以通過(guò)-a參數(shù)
腳本調(diào)試
redis3.2之后內(nèi)置了debug引擎砸逊,可以通過(guò)--ldb選項(xiàng)進(jìn)入debug模式
redis-cli --ldb evalsha 2cfe726fe60678e8ed4d689a3e98727d1e1e2339 1 test 1
Paste_Image.png