Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

StackExchange.Redis - Uso de LockTake / LockRelease


Existem 3 partes em uma fechadura:
  • a chave (o nome exclusivo da fechadura no banco de dados)
  • o valor (um token definido pelo chamador que pode ser usado para indicar quem é o "dono" do bloqueio e para verificar se a liberação e a extensão do bloqueio estão sendo feitas corretamente)
  • a duração (um bloqueio intencionalmente é uma coisa de duração finita)

Se nenhum outro valor vier à mente, um guid pode ser um "valor" adequado. Costumamos usar o nome da máquina (ou uma versão munged do nome da máquina se vários processos puderem competir na mesma máquina).

Além disso, observe que obter um bloqueio é especulativo , não bloqueando . É perfeitamente possível que você falhe para obter o bloqueio e, portanto, você pode precisar testar isso e talvez adicionar alguma lógica de repetição.

Um exemplo típico pode ser:
RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
    try {
        // you have the lock do work
    } finally {
        db.LockRelease(key, token);
    }
}

Observe que se o trabalho for longo (um loop, em particular), você pode querer adicionar alguns LockExtend ocasionais chamadas no meio - novamente lembrando-se de verificar o sucesso (caso tenha expirado).

Observe também que todos comandos redis individuais são atômicos, então você não precisa se preocupar com duas operações discretas competindo. Para unidades multioperacionais mais complexas, transações e scripts são opções.