Redis
 sql >> Database >  >> NoSQL >> Redis

StackExchange.Redis - Utilizzo di LockTake/LockRelease

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.