refactor(locker params): modify the locker lease time unit
1.modify the locker lease time unit
2.modify internalLockLeaseTime params unit
3.modify refreshTime params unit
4.modify lua script
This commit is contained in:
parent
310f4c043c
commit
23110cbba9
|
|
@ -14,8 +14,8 @@ local lockKey = KEYS[2] .. ':' .. ARGV[2];
|
||||||
if (mode == false) then
|
if (mode == false) then
|
||||||
redis.call('hset', KEYS[1], 'mode', 'read');
|
redis.call('hset', KEYS[1], 'mode', 'read');
|
||||||
redis.call('hset', KEYS[1], lockKey, '1');
|
redis.call('hset', KEYS[1], lockKey, '1');
|
||||||
redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
||||||
redis.call('expire', KEYS[1], ARGV[1]);
|
redis.call('pexpire', KEYS[1], ARGV[1]);
|
||||||
return 1;
|
return 1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
@ -29,11 +29,11 @@ end;
|
||||||
if (mode == 'read') then
|
if (mode == 'read') then
|
||||||
if (redis.call('exists', KEYS[1], ARGV[2]) == 1) then
|
if (redis.call('exists', KEYS[1], ARGV[2]) == 1) then
|
||||||
redis.call('hincrby', KEYS[1], lockKey, '1');
|
redis.call('hincrby', KEYS[1], lockKey, '1');
|
||||||
local remainTime = redis.call('httl', KEYS[1], 'fields', '1', lockKey);
|
local remainTime = redis.call('hpttl', KEYS[1], 'fields', '1', lockKey);
|
||||||
redis.call('hexpire', KEYS[1], math.max(tonumber(remainTime[1]), ARGV[1]), 'fields', '1', lockKey);
|
redis.call('hpexpire', KEYS[1], math.max(tonumber(remainTime[1]), ARGV[1]), 'fields', '1', lockKey);
|
||||||
else
|
else
|
||||||
redis.call('hset', KEYS[1], lockKey, '1');
|
redis.call('hset', KEYS[1], lockKey, '1');
|
||||||
redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
||||||
end;
|
end;
|
||||||
local cursor = 0;
|
local cursor = 0;
|
||||||
local maxRemainTime = tonumber(ARGV[1]);
|
local maxRemainTime = tonumber(ARGV[1]);
|
||||||
|
|
@ -45,13 +45,13 @@ if (mode == 'read') then
|
||||||
|
|
||||||
for i = 1, #fields,2 do
|
for i = 1, #fields,2 do
|
||||||
local field = fields[i];
|
local field = fields[i];
|
||||||
local remainTime = redis.call('httl', KEYS[1], 'fields', '1', field);
|
local remainTime = redis.call('hpttl', KEYS[1], 'fields', '1', field);
|
||||||
maxRemainTime = math.max(tonumber(remainTime[1]), maxRemainTime);
|
maxRemainTime = math.max(tonumber(remainTime[1]), maxRemainTime);
|
||||||
end;
|
end;
|
||||||
until cursor == 0;
|
until cursor == 0;
|
||||||
|
|
||||||
local remainTime = redis.call('ttl', KEYS[1]);
|
local remainTime = redis.call('pttl', KEYS[1]);
|
||||||
redis.call('expire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime));
|
redis.call('pexpire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime));
|
||||||
return 1;
|
return 1;
|
||||||
end;
|
end;
|
||||||
`
|
`
|
||||||
|
|
@ -86,7 +86,7 @@ if ((mode == 'read') and (lockExists == 0)) then
|
||||||
end;
|
end;
|
||||||
|
|
||||||
local counter = redis.call('hincrby', KEYS[1], lockKey, -1);
|
local counter = redis.call('hincrby', KEYS[1], lockKey, -1);
|
||||||
local delTTLs = redis.call('httl', KEYS[1], 'fields', '1', lockKey);
|
local delTTLs = redis.call('hpttl', KEYS[1], 'fields', '1', lockKey);
|
||||||
local delTTL = tonumber(delTTLs[1]);
|
local delTTL = tonumber(delTTLs[1]);
|
||||||
if (counter == 0) then
|
if (counter == 0) then
|
||||||
redis.call('hdel', KEYS[1], lockKey);
|
redis.call('hdel', KEYS[1], lockKey);
|
||||||
|
|
@ -103,17 +103,17 @@ if (redis.call('hlen', KEYS[1]) > 1) then
|
||||||
|
|
||||||
for i = 1, #fields,2 do
|
for i = 1, #fields,2 do
|
||||||
local field = fields[i];
|
local field = fields[i];
|
||||||
local remainTime = redis.call('httl', KEYS[1], 'fields', '1', field);
|
local remainTime = redis.call('hpttl', KEYS[1], 'fields', '1', field);
|
||||||
maxRemainTime = math.max(tonumber(remainTime[1]), maxRemainTime);
|
maxRemainTime = math.max(tonumber(remainTime[1]), maxRemainTime);
|
||||||
end;
|
end;
|
||||||
until cursor == 0;
|
until cursor == 0;
|
||||||
|
|
||||||
if (maxRemainTime > 0) then
|
if (maxRemainTime > 0) then
|
||||||
if (delTTL > maxRemainTime) then
|
if (delTTL > maxRemainTime) then
|
||||||
redis.call('expire', KEYS[1], maxRemainTime);
|
redis.call('pexpire', KEYS[1], maxRemainTime);
|
||||||
else
|
else
|
||||||
local remainTime = redis.call('ttl', KEYS[1]);
|
local remainTime = redis.call('pttl', KEYS[1]);
|
||||||
redis.call('expire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime));
|
redis.call('pexpire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime));
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
|
|
@ -149,8 +149,8 @@ if (mode == false) then
|
||||||
end;
|
end;
|
||||||
redis.call('hset', KEYS[1], 'mode', 'write');
|
redis.call('hset', KEYS[1], 'mode', 'write');
|
||||||
redis.call('hset', KEYS[1], lockKey, 1);
|
redis.call('hset', KEYS[1], lockKey, 1);
|
||||||
redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
||||||
redis.call('expire', KEYS[1], ARGV[1]);
|
redis.call('pexpire', KEYS[1], ARGV[1]);
|
||||||
redis.call('lpop', waitKey, '1');
|
redis.call('lpop', waitKey, '1');
|
||||||
return 1;
|
return 1;
|
||||||
elseif (mode == 'read') then
|
elseif (mode == 'read') then
|
||||||
|
|
@ -163,8 +163,8 @@ else
|
||||||
local lockExists = redis.call('hexists', KEYS[1], lockKey);
|
local lockExists = redis.call('hexists', KEYS[1], lockKey);
|
||||||
if (lockExists == 1) then
|
if (lockExists == 1) then
|
||||||
redis.call('hincrby', KEYS[1], lockKey, 1);
|
redis.call('hincrby', KEYS[1], lockKey, 1);
|
||||||
redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
||||||
redis.call('expire', KEYS[1], ARGV[1]);
|
redis.call('pexpire', KEYS[1], ARGV[1]);
|
||||||
return 1;
|
return 1;
|
||||||
end;
|
end;
|
||||||
-- 放到 list 中等待写锁释放后再次尝试加锁并且订阅写锁释放的消息
|
-- 放到 list 中等待写锁释放后再次尝试加锁并且订阅写锁释放的消息
|
||||||
|
|
@ -233,7 +233,7 @@ local lockExists = redis.call('hexists', KEYS[1], lockKey);
|
||||||
local mode = redis.call('hget', KEYS[1], 'mode');
|
local mode = redis.call('hget', KEYS[1], 'mode');
|
||||||
local maxRemainTime = tonumber(ARGV[1]);
|
local maxRemainTime = tonumber(ARGV[1]);
|
||||||
if (lockExists == 1) then
|
if (lockExists == 1) then
|
||||||
redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey);
|
||||||
if (mode == 'read') then
|
if (mode == 'read') then
|
||||||
local cursor = 0;
|
local cursor = 0;
|
||||||
local pattern = KEYS[2] .. ':*';
|
local pattern = KEYS[2] .. ':*';
|
||||||
|
|
@ -244,19 +244,19 @@ if (lockExists == 1) then
|
||||||
|
|
||||||
for i = 1, #fields,2 do
|
for i = 1, #fields,2 do
|
||||||
local field = fields[i];
|
local field = fields[i];
|
||||||
local remainTime = redis.call('httl', KEYS[1], 'fields', '1', field);
|
local remainTime = redis.call('hpttl', KEYS[1], 'fields', '1', field);
|
||||||
maxRemainTime = math.max(tonumber(remainTime[1]), maxRemainTime);
|
maxRemainTime = math.max(tonumber(remainTime[1]), maxRemainTime);
|
||||||
end;
|
end;
|
||||||
until cursor == 0;
|
until cursor == 0;
|
||||||
|
|
||||||
if (maxRemainTime > 0) then
|
if (maxRemainTime > 0) then
|
||||||
local remainTime = redis.call('ttl', KEYS[1]);
|
local remainTime = redis.call('pttl', KEYS[1]);
|
||||||
redis.call('expire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime));
|
redis.call('pexpire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime));
|
||||||
end;
|
end;
|
||||||
elseif (mode == 'write') then
|
elseif (mode == 'write') then
|
||||||
redis.call('expire', KEYS[1], ARGV[1]);
|
redis.call('pexpire', KEYS[1], ARGV[1]);
|
||||||
end;
|
end;
|
||||||
-- return redis.call('ttl',KEYS[1]);
|
-- return redis.call('pttl',KEYS[1]);
|
||||||
return 1;
|
return 1;
|
||||||
end;
|
end;
|
||||||
return -8;
|
return -8;
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
internalLockLeaseTime = uint64(30)
|
internalLockLeaseTime = uint64(30 * 1000)
|
||||||
unlockMessage = 0
|
unlockMessage = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -128,7 +128,7 @@ ARGV[2]:当前客户端的唯一标识(token),用于区分不同的客户端
|
||||||
func (rl *redissionLocker) refreshLockTimeout(ctx context.Context) {
|
func (rl *redissionLocker) refreshLockTimeout(ctx context.Context) {
|
||||||
rl.Logger.Info("lock refresh by key and token", zap.String("token", rl.Token), zap.String("key", rl.Key))
|
rl.Logger.Info("lock refresh by key and token", zap.String("token", rl.Token), zap.String("key", rl.Key))
|
||||||
|
|
||||||
lockTime := time.Duration(rl.lockLeaseTime/3) * time.Second
|
lockTime := time.Duration(rl.lockLeaseTime/3) * time.Millisecond
|
||||||
timer := time.NewTimer(lockTime)
|
timer := time.NewTimer(lockTime)
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@ func (rl *RedissionRWLocker) tryRLock(ctx context.Context) error {
|
||||||
func (rl *RedissionRWLocker) refreshLockTimeout(ctx context.Context) {
|
func (rl *RedissionRWLocker) refreshLockTimeout(ctx context.Context) {
|
||||||
rl.Logger.Info("lock refresh by key and token", zap.String("token", rl.Token), zap.String("key", rl.Key))
|
rl.Logger.Info("lock refresh by key and token", zap.String("token", rl.Token), zap.String("key", rl.Key))
|
||||||
|
|
||||||
lockTime := time.Duration(rl.lockLeaseTime/3) * time.Second
|
lockTime := time.Duration(rl.lockLeaseTime/3) * time.Millisecond
|
||||||
timer := time.NewTimer(lockTime)
|
timer := time.NewTimer(lockTime)
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue