Heim >Datenbank >Redis >So sperren Sie ein Redis

So sperren Sie ein Redis

尚
Original
2019-06-28 15:24:452790Durchsuche

So sperren Sie ein Redis

Redis-Sperrklassifizierung

Die Sperrbefehle, die von Redis verwendet werden können, sind INCR, SETNX und SET.

1. Der erste Sperrbefehl INCR

Die Idee dieser Art der Sperre besteht darin, dass der Wert des Schlüssels zuerst auf 0 initialisiert wird, wenn der Schlüssel nicht vorhanden ist. und dann wird die INCR-Operation ausgeführt.
Wenn dann andere Benutzer die INCR-Operation ausführen, um eine hinzuzufügen, bedeutet dies, dass die zurückgegebene Zahl größer als 1 ist, dass die Sperre verwendet wird.

1. Client A fordert den Server auf, den Schlüsselwert 1 zu erhalten, was bedeutet, dass die Sperre erhalten wird

2. Client B fordert den Server auch auf, den Schlüsselwert 2 zu erhalten. was bedeutet, dass die Sperrenerfassung fehlschlägt

3. Client A schließt die Ausführung des Codes ab und löscht die Sperre

4 Client B wartet eine Zeit lang und erhält den Schlüsselwert 1 Wenn Sie eine Anfrage stellen, wird angezeigt, dass die Sperre erfolgreich ist

5. Client B führt den Code aus und löscht die Sperre

$redis->incr($key);
$redis->expire($key, $ttl); //设置生成时间为1秒

2 Hinter dieser Art der Sperrung steckt, dass, wenn der Schlüssel nicht existiert, der Schlüssel auf Wert gesetzt wird

Wenn der Schlüssel bereits existiert, ergreift SETNX keine Aktion

1. Client A fordert den Server an Wenn die Einstellung erfolgreich ist, bedeutet dies, dass die Sperre erfolgreich ist.

2. Client B fordert den Server außerdem auf, den Schlüsselwert festzulegen. Wenn die Rückgabe fehlschlägt, bedeutet dies, dass die Sperre fehlgeschlagen ist

3. Client A schließt die Codeausführung ab und löscht die Sperre

4. Client B fordert nach einer gewissen Zeit an, den Schlüsselwert festzulegen, und die Einstellung ist erfolgreich

5. Client B schließt die Codeausführung ab und löscht die Sperre

$redis->setNX($key, $value);
$redis->expire($key, $ttl);

3. Die dritte Art von Sperre SET

Es gibt ein Problem mit den beiden oben genannten Methoden Stellen Sie fest, dass Sie den Schlüsselablauf festlegen müssen. Warum müssen wir also den Schlüsselablauf festlegen? Wenn die Anforderungsausführung aus irgendeinem Grund unerwartet beendet wird und die Sperre erstellt, aber nicht gelöscht wird, bleibt die Sperre immer bestehen, sodass der Cache in Zukunft nie mehr aktualisiert wird. Daher müssen wir der Sperre eine Ablaufzeit hinzufügen, um Unfälle zu verhindern.

Aber das Festlegen mit Expire ist keine atomare Operation. Daher kann die Atomizität auch durch Transaktionen gewährleistet werden, es gibt jedoch immer noch einige Probleme, weshalb der Beamte ab Version 2.6.12 die Funktion zum Festlegen der Ablaufzeit umfasst.

1. Client A fordert den Server auf, den Schlüsselwert festzulegen. Wenn die Einstellung erfolgreich ist, ist die Sperre erfolgreich.

2 die Rückgabe schlägt fehl, dann bedeutet dies, dass die Sperre fehlgeschlagen ist

3. Client A schließt die Ausführung des Codes ab und löscht die Sperre

4. Client B fordert das Festlegen des Schlüsselwerts an Nach einiger Zeit ist die Einstellung erfolgreich

5. Client B führt den Code aus und löscht die Sperre

 $redis->set($key, $value, array('nx', 'ex' => $ttl)); //ex表示秒

Weitere Informationen zu Redis finden Sie im

Tutorial zur Redis-Nutzung

Kolumne!

Das obige ist der detaillierte Inhalt vonSo sperren Sie ein Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn