Richtige Methode zum Entsperren der Redis-Sperre

小云云
Freigeben: 2023-03-17 21:50:01
Original
2806 Leute haben es durchsucht

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")
}
Nach dem Login kopieren

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")
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage