Redis
 sql >> Datenbank >  >> NoSQL >> Redis

StackExchange.Redis – Verwendung von LockTake/LockRelease

Ein Schloss besteht aus 3 Teilen:

  • der Schlüssel (der eindeutige Name des Schlosses in der Datenbank)
  • der Wert (ein vom Aufrufer definiertes Token, das verwendet werden kann, um anzuzeigen, wem die Sperre "gehört", und um zu überprüfen, ob das Freigeben und Erweitern der Sperre korrekt erfolgt)
  • die Dauer (eine Sperre hat absichtlich eine endliche Dauer)

Wenn Ihnen kein anderer Wert einfällt, kann eine Anleitung einen geeigneten "Wert" ergeben. Wir neigen dazu, den Maschinennamen zu verwenden (oder eine mungierte Version des Maschinennamens, wenn mehrere Prozesse auf derselben Maschine konkurrieren könnten).

Beachten Sie auch, dass das Nehmen einer Sperre spekulativ ist , nicht blockieren . Es ist durchaus möglich, dass Sie durchfallen um die Sperre zu erhalten, und daher müssen Sie dies möglicherweise testen und möglicherweise eine Wiederholungslogik hinzufügen.

Ein typisches Beispiel könnte sein:

RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
    try {
        // you have the lock do work
    } finally {
        db.LockRelease(key, token);
    }
}

Beachten Sie, dass Sie bei längerer Arbeit (insbesondere bei einer Schleife) gelegentlich LockExtend hinzufügen möchten Anrufe in der Mitte - wieder daran denken, auf Erfolg zu prüfen (falls Zeitüberschreitung).

Beachten Sie auch, dass alle einzelne redis-Befehle sind atomar, sodass Sie sich keine Gedanken darüber machen müssen, dass zwei diskrete Operationen miteinander konkurrieren. Für komplexere Einheiten mit mehreren Operationen Transaktionen und Scripting sind Optionen.