redisson分布式鎖lua腳本翻譯


1.獲取鎖

 lock入參:
keys[1]:自定義鎖的key  RLock lock = redissonClient.getLock(lockKey);
argv[1]=鎖的租期,默認30s  
argv[2]=鎖的名稱(UUID:threadId)

if(exists keys[1]==0  1.不存在key鎖) then
hset keys[1] argv[2] 1  賦值 key field value-->1.1嘗試獲取鎖
pexpire keys[1] argv[1] 過期 expire key time-->1.2設置鎖過期時間
return 空;
end

if(hexists keys[1] argv[2]==1  存在Key name 的鎖--》2.當前線程已獲取鎖) then
hincrby keys[1] argv[2] 1    -->2.1原子計數器+1  鎖重入!!!
pexpire keys[1] argv[1]  過期-->2.2重置鎖過期時間
return 空;
end

return pttl keys[1]-->3.返回剩余過期時間

 ps:lua腳本數組下標從1開始

 

2.釋放鎖

 unlock入參:
keys[1]:自定義鎖的key  RLock lock = redissonClient.getLock(lockKey);
keys[2]:通道名稱  redisson_lock__channel:{UUID:threadId}
argv[1]= publish unlock消息=0
argv[2]=鎖的租期,默認30s
argv[3]=鎖的名稱(UUID:threadId)

if(hexists keys[1] argv[3]==0-->1.不存在key鎖,直接返回) then
return 空

counter=hincrby keys[1] argv[3] -1-->2.存在鎖,原子計數器-1

if(counter>0) then pexpire KEYS[1] ARGV[2]-->2.1 計數器>0,還有鎖沒釋放,重置鎖過期時間
return 0;

else -->2.2計數器=0,鎖已經全部釋放完畢。
del KEYS[1]-->刪除key
publish KEYS[2] ARGV[1]-->發布消息 publish channel message
return 1;
end
return 空;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM