63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package luascript
|
||
|
||
/*
|
||
KEYS[1]:锁的键名(key),通常是锁的唯一标识。
|
||
ARGV[1]:锁的过期时间(lockLeaseTime),单位为秒。
|
||
ARGV[2]:当前客户端的唯一标识(token),用于区分不同的客户端。
|
||
*/
|
||
var LockScript = `
|
||
-- 锁不存在的情况下加锁
|
||
if (redis.call('exists', KEYS[1]) == 0) then
|
||
redis.call('hset', KEYS[1], ARGV[2], 1);
|
||
redis.call('expire', KEYS[1], ARGV[1]);
|
||
return 1;
|
||
end;
|
||
-- 重入锁逻辑
|
||
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then
|
||
redis.call('hincrby', KEYS[1], ARGV[2], 1);
|
||
redis.call('expire', KEYS[1], ARGV[1]);
|
||
return 1;
|
||
end;
|
||
-- 持有锁的 token 不是当前客户端的 token,返回加锁失败
|
||
return -9;
|
||
`
|
||
|
||
/*
|
||
KEYS[1]:锁的键名(key),通常是锁的唯一标识。
|
||
ARGV[1]:锁的过期时间(lockLeaseTime),单位为秒。
|
||
ARGV[2]:当前客户端的唯一标识(token),用于区分不同的客户端。
|
||
*/
|
||
var RefreshLockScript = `
|
||
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then
|
||
redis.call('expire', KEYS[1], ARGV[1]);
|
||
return 1;
|
||
end;
|
||
return -8;
|
||
`
|
||
|
||
/*
|
||
KEYS[1]:锁的键名(key),通常是锁的唯一标识。
|
||
KEYS[2]:锁的释放通知频道(chankey),用于通知其他客户端锁已释放。
|
||
ARGV[1]:解锁消息(unlockMessage),用于通知其他客户端锁已释放。
|
||
ARGV[2]:当前客户端的唯一标识(token),用于区分不同的客户端。
|
||
*/
|
||
var UnLockScript = `
|
||
if (redis.call('exists', KEYS[1]) == 0) then
|
||
redis.call('publish', KEYS[2], ARGV[1]);
|
||
return 1;
|
||
end;
|
||
if (redis.call('hexists', KEYS[1], ARGV[2]) == 0) then
|
||
return 1;
|
||
end;
|
||
local counter = redis.call('hincrby', KEYS[1], ARGV[2], -1);
|
||
if (counter > 0) then
|
||
return 1;
|
||
else
|
||
redis.call('del', KEYS[1]);
|
||
redis.call('publish', KEYS[2], ARGV[1]);
|
||
return 1;
|
||
end;
|
||
-- 持有锁的 token 不是当前客户端的 token,返回解锁失败
|
||
return -10;
|
||
`
|