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