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