分布式赤鎖のロックのluaの底層の設計原理
2341 ワード
分布式赤鎖のロックのluaの底層の設計原理
前に2つの動作をします:1.まず3台のredis keyをすべてクリア(debugに干渉されないようにロックを削除しなければならない)127.0.0.1:6379>flushdb OK
2.isLock = redLock.tryLock(1000530, 1000605*30, TimeUnit.MILLISECONDS);
デバグのブレークポイントはRedissonLockにある.tryLockInnerAsync(long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand command)
KEYS[1]:Collections.singletonList(getName()は、分散ロックのkey、すなわちMY_REDLOCK ARGV[1]:internalLockLeaseTimeはロックのリース時間、すなわち期限切れ時間ARGV[2]:getLockName(threadId)(4218379 f-849 d-498 f-8 c 28-56 f 3 fce 42 f 71:52)はredis接続id+スレッドid、すなわちUUID+threadIdを表し、ロックを構成する取得者は、誰がそのロックを手に入れたかである.
前に2つの動作をします:1.まず3台のredis keyをすべてクリア(debugに干渉されないようにロックを削除しなければならない)127.0.0.1:6379>flushdb OK
2.isLock = redLock.tryLock(1000530, 1000605*30, TimeUnit.MILLISECONDS);
デバグのブレークポイントはRedissonLockにある.tryLockInnerAsync(long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand command)
RFuture tryLockInnerAsync(long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand command) {
internalLockLeaseTime = unit.toMillis(leaseTime);
return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, command,
"if (redis.call('exists', KEYS[1]) == 0) then " + //key , ,
"redis.call('hset', KEYS[1], ARGV[2], 1); " + // hset MY_REDLOCK UUID+threadId 1
"redis.call('pexpire', KEYS[1], ARGV[1]); " + // pexpire MY_REDLOCK 。
"return nil; " + // nil,
"end; " +
"if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then " +//
"redis.call('hincrby', KEYS[1], ARGV[2], 1); " + // , 1
"redis.call('pexpire', KEYS[1], ARGV[1]); " + //
"return nil; " + // nil,
"end; " +
// if , 2 ?
//1. (UUID+threadId,hash ) ? , , , 。
//2. , 1? , , return nil, 。
// key , 2 if nil , ,
// ? ,
"return redis.call('pttl', KEYS[1]);",
Collections.
KEYS[1]:Collections.singletonList(getName()は、分散ロックのkey、すなわちMY_REDLOCK ARGV[1]:internalLockLeaseTimeはロックのリース時間、すなわち期限切れ時間ARGV[2]:getLockName(threadId)(4218379 f-849 d-498 f-8 c 28-56 f 3 fce 42 f 71:52)はredis接続id+スレッドid、すなわちUUID+threadIdを表し、ロックを構成する取得者は、誰がそのロックを手に入れたかである.