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 空;