diff --git a/distributedlock/luascript/rwlock_script.go b/distributedlock/luascript/rwlock_script.go index db58a52..b26f557 100644 --- a/distributedlock/luascript/rwlock_script.go +++ b/distributedlock/luascript/rwlock_script.go @@ -14,8 +14,8 @@ local lockKey = KEYS[2] .. ':' .. ARGV[2]; if (mode == false) then redis.call('hset', KEYS[1], 'mode', 'read'); redis.call('hset', KEYS[1], lockKey, '1'); - redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey); - redis.call('expire', KEYS[1], ARGV[1]); + redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey); + redis.call('pexpire', KEYS[1], ARGV[1]); return 1; end; @@ -29,11 +29,11 @@ end; if (mode == 'read') then if (redis.call('exists', KEYS[1], ARGV[2]) == 1) then redis.call('hincrby', KEYS[1], lockKey, '1'); - local remainTime = redis.call('httl', KEYS[1], 'fields', '1', lockKey); - redis.call('hexpire', KEYS[1], math.max(tonumber(remainTime[1]), ARGV[1]), 'fields', '1', lockKey); + local remainTime = redis.call('hpttl', KEYS[1], 'fields', '1', lockKey); + redis.call('hpexpire', KEYS[1], math.max(tonumber(remainTime[1]), ARGV[1]), 'fields', '1', lockKey); else 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; local cursor = 0; local maxRemainTime = tonumber(ARGV[1]); @@ -45,13 +45,13 @@ if (mode == 'read') then for i = 1, #fields,2 do 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); end; until cursor == 0; - local remainTime = redis.call('ttl', KEYS[1]); - redis.call('expire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime)); + local remainTime = redis.call('pttl', KEYS[1]); + redis.call('pexpire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime)); return 1; end; ` @@ -86,7 +86,7 @@ if ((mode == 'read') and (lockExists == 0)) then end; 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]); if (counter == 0) then redis.call('hdel', KEYS[1], lockKey); @@ -103,17 +103,17 @@ if (redis.call('hlen', KEYS[1]) > 1) then for i = 1, #fields,2 do 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); end; until cursor == 0; if (maxRemainTime > 0) then if (delTTL > maxRemainTime) then - redis.call('expire', KEYS[1], maxRemainTime); + redis.call('pexpire', KEYS[1], maxRemainTime); else - local remainTime = redis.call('ttl', KEYS[1]); - redis.call('expire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime)); + local remainTime = redis.call('pttl', KEYS[1]); + redis.call('pexpire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime)); end; end; else @@ -149,8 +149,8 @@ if (mode == false) then end; redis.call('hset', KEYS[1], 'mode', 'write'); redis.call('hset', KEYS[1], lockKey, 1); - redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey); - redis.call('expire', KEYS[1], ARGV[1]); + redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey); + redis.call('pexpire', KEYS[1], ARGV[1]); redis.call('lpop', waitKey, '1'); return 1; elseif (mode == 'read') then @@ -163,8 +163,8 @@ else local lockExists = redis.call('hexists', KEYS[1], lockKey); if (lockExists == 1) then redis.call('hincrby', KEYS[1], lockKey, 1); - redis.call('hexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey); - redis.call('expire', KEYS[1], ARGV[1]); + redis.call('hpexpire', KEYS[1], ARGV[1], 'fields', '1', lockKey); + redis.call('pexpire', KEYS[1], ARGV[1]); return 1; end; -- 放到 list 中等待写锁释放后再次尝试加锁并且订阅写锁释放的消息 @@ -233,7 +233,7 @@ local lockExists = redis.call('hexists', KEYS[1], lockKey); local mode = redis.call('hget', KEYS[1], 'mode'); local maxRemainTime = tonumber(ARGV[1]); 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 local cursor = 0; local pattern = KEYS[2] .. ':*'; @@ -244,19 +244,19 @@ if (lockExists == 1) then for i = 1, #fields,2 do 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); end; until cursor == 0; if (maxRemainTime > 0) then - local remainTime = redis.call('ttl', KEYS[1]); - redis.call('expire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime)); + local remainTime = redis.call('pttl', KEYS[1]); + redis.call('pexpire', KEYS[1], math.max(tonumber(remainTime),maxRemainTime)); end; elseif (mode == 'write') then - redis.call('expire', KEYS[1], ARGV[1]); + redis.call('pexpire', KEYS[1], ARGV[1]); end; - -- return redis.call('ttl',KEYS[1]); + -- return redis.call('pttl',KEYS[1]); return 1; end; return -8; diff --git a/distributedlock/redis_lock.go b/distributedlock/redis_lock.go index 0cdbb39..aed73dc 100644 --- a/distributedlock/redis_lock.go +++ b/distributedlock/redis_lock.go @@ -18,7 +18,7 @@ import ( ) const ( - internalLockLeaseTime = uint64(30) + internalLockLeaseTime = uint64(30 * 1000) unlockMessage = 0 ) @@ -128,7 +128,7 @@ ARGV[2]:当前客户端的唯一标识(token),用于区分不同的客户端 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)) - lockTime := time.Duration(rl.lockLeaseTime/3) * time.Second + lockTime := time.Duration(rl.lockLeaseTime/3) * time.Millisecond timer := time.NewTimer(lockTime) defer timer.Stop() diff --git a/distributedlock/redis_rwlock.go b/distributedlock/redis_rwlock.go index 9cde98e..52e44af 100644 --- a/distributedlock/redis_rwlock.go +++ b/distributedlock/redis_rwlock.go @@ -112,7 +112,7 @@ func (rl *RedissionRWLocker) tryRLock(ctx context.Context) error { 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)) - lockTime := time.Duration(rl.lockLeaseTime/3) * time.Second + lockTime := time.Duration(rl.lockLeaseTime/3) * time.Millisecond timer := time.NewTimer(lockTime) defer timer.Stop()