分布式赤鎖のロックの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)
 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.singletonList(getName()), internalLockLeaseTime, getLockName(threadId));
}

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を表し、ロックを構成する取得者は、誰がそのロックを手に入れたかである.