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.