Redis ist ein guter Freund von PHP. Beim Schreiben von Geschäften in PHP wird manchmal das Konzept der Sperre verwendet. Nur eine Person kann gleichzeitig ein bestimmtes Verhalten ausführen. Zu diesem Zeitpunkt müssen wir Schlösser verwenden. Es gibt mehrere Sperrmethoden. PHP kann keine Sperren im Speicher verwenden und ZooKeeper kann nicht zum Sperren verwendet werden. Derzeit wählen wir im Allgemeinen Redis als Sperrmechanismus. Dieser Artikel teilt Ihnen hauptsächlich die richtige Methode zum Entsperren von Redis mit und hofft, allen zu helfen.
setnx
Die einfachste in Redis gesperrte Datenstruktur ist String. In den ersten Tagen wurde setnx im Allgemeinen zum Festlegen eines Werts verwendet, wenn :lock nicht vorhanden ist. Um den Ablauf der Sperre zu verlängern, verwenden Sie möglicherweise del Der Pseudocode lautet wie folgt:
if (Redis::setnx("my:lock", 1)) { Redis::expire("my:lock", 10); // ... do something Redis::del("my:lock") }
Hier liegt tatsächlich ein Problem vor. Das Problem besteht darin, dass es zu einem Absturz oder einem anderen Verhalten kommt setnx und Expire, die Sperre wird möglicherweise nicht aufgehoben. Eine weitere Optimierungslösung könnte also darin bestehen, den Zeitstempel im Schloss zu speichern. Bestimmen Sie die Länge des Zeitstempels.
set
Jetzt wird offiziell empfohlen, set direkt zum Implementieren der Sperre zu verwenden. Wir können den Set-Befehl verwenden, um setnx zu ersetzen, der wie folgt aussieht
if (Redis::set("my:lock", 1, "nx", "ex", 10)) { ... do something Redis::del("my:lock") }
Der obige Code setzt my:lock genau dann auf 1, wenn dies der Fall ist Wenn die Sperre nicht vorhanden ist, wird die Ablaufzeit nach Abschluss der Einstellung auf 10 eingestellt.
Der Mechanismus zum Erwerb von Sperren ist korrekt, aber der Mechanismus zum direkten Löschen von Sperren mit del ist falsch. Denn es kann dazu führen, dass versehentlich die Sperren anderer Personen gelöscht werden.
Zum Beispiel habe ich diese Sperre für 10 Sekunden gesperrt, aber die Verarbeitungszeit war länger als 10 Sekunden. Nach 10 Sekunden ist die Sperre automatisch abgelaufen, wurde von anderen aufgehoben und erneut gesperrt. Wenn ich dann zu diesem Zeitpunkt erneut Redis::del aufrufe, wird die von anderen erstellte Sperre gelöscht.
Der Beamte hat auch Vorschläge zum Entsperren von Befehlen. Es wird empfohlen, das Lua-Skript zu verwenden, zuerst get und dann del auszuführen.
Das Programm wird zu:
$token = rand(1, 100000); function lock() { return Redis::set("my:lock", $token, "nx", "ex", 10); } function unlock() { $script = ` if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end ` return Redis::eval($script, "my:lock", $token) } if (lock()) { // do something unlock(); }
Der Token hier ist eine Zufallszahl. Beim Sperren wird dieser Token in my:lock von redis gespeichert. Wenn Sie ihn löschen möchten, holen Sie sich ihn zuerst it, Die Token sind konsistent, was bedeutet, dass die Sperre zuvor von mir festgelegt wurde. Andernfalls bedeutet dies, dass die Sperre abgelaufen ist und von einer anderen Person festgelegt wurde, und ich sollte keine Vorgänge daran ausführen.
Also: Verwenden Sie setnx nicht mehr, sondern verwenden Sie set direkt für die Sperrimplementierung.
Verwandte Empfehlungen:
php Verwendung der Redis-Sperre zur Begrenzung der gleichzeitigen Zugriffsklasse
php Beispiel für die Verwendung der Redis-Sperre zur Begrenzung der gleichzeitigen Zugriffsklasse
Zusammenfassung gängiger Methoden zum Betrieb von Redis in PHP
Das obige ist der detaillierte Inhalt vonRichtige Methode zum Entsperren der Redis-Sperre. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!