Ci sono 3 parti in una serratura:
- la chiave (il nome univoco della serratura nel database)
- il valore (un token definito dal chiamante che può essere utilizzato sia per indicare chi "possiede" il lucchetto, sia per verificare che il rilascio e l'estensione del lucchetto avvenga correttamente)
- la durata (un blocco è intenzionalmente una cosa di durata finita)
Se non viene in mente nessun altro valore, un guid potrebbe creare un "valore" adatto. Tendiamo a usare il nome della macchina (o una versione modificata del nome della macchina se più processi possono essere in competizione sulla stessa macchina).
Inoltre, tieni presente che prendere un lucchetto è speculativo , non blocco . È del tutto possibile che tu fallisca per ottenere il blocco, e quindi potrebbe essere necessario verificarlo e forse aggiungere un po' di logica per i tentativi.
Un tipico esempio potrebbe essere:
RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
try {
// you have the lock do work
} finally {
db.LockRelease(key, token);
}
}
Nota che se il lavoro è lungo (un ciclo, in particolare), potresti voler aggiungere qualche LockExtend
occasionale chiama nel mezzo - ricordando ancora una volta di verificare la riuscita (in caso di timeout).
Nota anche che tutti i singoli comandi redis sono atomici, quindi non devi preoccuparti di due operazioni discrete in competizione. Per unità multi-operazione più complesse, transazioni e script sono opzioni.