Distribuído redssion Bloqueio
- Adquirir um bloqueio
A chamada de um retorno real após RedissonLock objetos método getLock ()
- bloqueio
Na fechadura RedissonLock objecto () chamada de método para tryAcquire principal método (), o leasetime == -1, em seguida, ir método tryLockInnerAsync (),
- Bloqueando detalhes
Combinação da declaração de parâmetro acima, podemos saber, aqui KEYS [1] é getName (), ARGV [2] é getLockName (ThreadID), passar o tempo e assumir que o nome de bloqueio adquirido é "anyLock", o ID thread é assumido que a chamada é thread -1 é assumido tipo UUID ID variável membro é 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: 65, em seguida, CHAVES [1] = anyLock, ARGV [2] = 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: Linha-1, assim , isso significa que um script, é determinado que não há um chamado "anyLock" de key2, se não, em que é fornecido um campo "85b196ce-e6f2-42ff-b3d7-6615b6748b5d: thread-1", o valor " uma "chave, e definir o seu tempo de validade 3, se presente, é também definido" 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: Linha-1 "existe, se estiver presente, o seu valor é incrementado por um, e re 4 definir o tempo de expiração, retorno ao "anyLock" tempo de sobrevida (ms)
- estrutura de bloqueio Redis
As estruturas de dados aqui é o hash, estrutura hash é: uma chave de Campo 1 Campo 2 valor o valor de 2. . . Sob este cenário com fechadura, chave nome de bloqueio diz, pode ser entendido como um recurso crítico, significa que o campo atual para adquirir um bloqueio de segmento de bloqueio todas as competições esta discussão deve ser julgado nesta chave não tem seu próprio segmento do campo, Se não, o bloqueio não pode ser obtido, se assim for, a re-entrada correspondente ao valor do campo mais 1 (vezes)
- Unlock
Nós ainda assumir name = anyLock, o ID thread é assumido Thread-1, Da mesma forma, podemos saber teclas [. 1] é um getName (), ou seja, as teclas [1] = anyLock, chaves [2] é getChannelName (), ou seja KEYS [ 2] = redisson_lock__channel: {anyLock}, ARGV [1] é LockPubSub.unlockMessage, isto é ARGV [1] = 0, ARGV [2] é o tempo para vivo, ARGV [3] é getLockName (ThreadID), isto é ARGV [3] = 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: thread-1, portanto, os meios de script acima: 1, para determinar se existe um lugar chamado "anyLock" de key2, se não, para o canal de transmissão de uma mensagem de que o conteúdo é transmitido 0, 1,3 e retorna, se presente, é ainda determinado campo 85b196ce-e6f2-42ff-b3d7-6615b6748b5d: Linha-1 está presente. 4, se o campo de não existir, devolvidos vazios, se o campo está presente, o valor do campo de menos de 1,5, depois de menos completa se o valor do campo é ainda maior do que 0, retorna para 0,6, após a redução, quando o valor do campo é menor do que ou igual a 0 , em seguida, transmitir um conteúdo mensagem de difusão é 0, e retorna 1; pode adivinhar, 0 para os recursos de transmissão estão disponíveis, notificar essas threads esperando para adquirir o bloqueio de um bloqueio já está disponível
- Wait
private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException { long threadId = Thread.currentThread().getId(); Long ttl = tryAcquire(leaseTime, unit, threadId); // lock acquired if (ttl == null) { return; } RFuture<RedissonLockEntry> future = subscribe(threadId); if (interruptibly) { commandExecutor.syncSubscriptionInterrupted(future); } else { commandExecutor.syncSubscription(future); } try { while (true) { ttl = tryAcquire(leaseTime, unit, threadId); // lock acquired if (ttl == null) { break; } // waiting for message if (ttl >= 0) { try { future.getNow().getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { if (interruptibly) { throw e; } future.getNow().getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS); } } else { if (interruptibly) { future.getNow().getLatch().acquire(); } else { future.getNow().getLatch().acquireUninterruptibly(); } } } } finally { unsubscribe(future, threadId); } // get(lockAsync(leaseTime, unit)); }
Aqui se inscrever Channel, quando os recursos estão disponíveis pode ser hora de saber, e para aproveitar, para evitar sondagem inválida e um desperdício de recursos quando os recursos estão disponíveis usando o tempo para tentar adquirir o ciclo de bloqueio, devido às múltiplas threads ao mesmo tempo para competir por recursos, por isso aqui com o semáforos, para os mesmos recursos, permitindo que apenas um segmento para adquirir um bloqueio, outros segmentos são bloqueados
- resumo