Heim > Datenbank > Redis > Hauptteil

Welche Möglichkeiten gibt es, Redis zu sperren?

WBOY
Freigeben: 2023-05-27 12:43:06
nach vorne
1435 Leute haben es durchsucht

Die üblichen Sperrbefehle von Redis sind INCR, SETNX, SET

1, INCR

Die Sperridee dieser Art von Sperre ist:

Schlüssel existiert nicht, dann wird der Wert des Schlüssels Zuerst wird es auf 0 initialisiert und dann wird die INCR-Operation ausgeführt, um eins hinzuzufügen.

Wenn dann andere Benutzer die INCR-Operation zum Hinzufügen eines Schlüssels ausführen und der zurückgegebene Wert größer als 1 ist, bedeutet dies, dass der Schlüssel für die Verwendung gesperrt ist.

1. Client A fordert den Server auf, den Schlüssel mit dem Wert 1 zu erhalten, was anzeigt, dass die Sperre erhalten wurde.

2 Client B fordert den Server ebenfalls auf, den Schlüssel mit dem Wert 2 zu erhalten Die Sperrenerfassung ist fehlgeschlagen.

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

4. Nach einer gewissen Wartezeit erhält Client B bei der Anforderung den Schlüsselwert 1, was darauf hinweist, dass die Sperre erfolgreich erhalten wurde

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

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

Spezifischer Befehl: SETNX

Die Idee dieser Art der Sperre besteht darin, den Schlüssel auf Wert zu setzen, wenn er nicht vorhanden ist. Wenn der Schlüssel vorhanden ist, ergreift SETNX keine Aktion.

SETNX ist die Abkürzung für SET if Not eXists.

1. Wenn die Einstellung erfolgreich ist, fordert Client B den Server auf, den Schlüsselwert festzulegen. Dies bedeutet, dass die Sperrung fehlschlägt . Client B schließt die Ausführung des Codes ab und löscht die Sperre

127.0.0.1:6379>INCR keyName
Nach dem Login kopieren

Wenn die Einstellung erfolgreich ist, wird 1 zurückgegeben; wenn die Einstellung fehlschlägt, wird 0 zurückgegeben

Bei den beiden oben genannten Methoden liegt ein Problem vor. Sie werden feststellen, dass Sie den Schlüsselablauf festlegen müssen.

Warum müssen Sie 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.

Deshalb müssen wir der Sperre eine Ablaufzeit hinzufügen, um unerwartete Ereignisse zu verhindern.

Aber das Festlegen mit Expire ist keine atomare Operation.

Sie können also auch die Atomizität durch Transaktionen sicherstellen, aber es gibt immer noch einige Probleme, daher hat der Beamte ab Version 2.6.12 die Funktion zum Festlegen der Ablaufzeit in den SET-Befehl selbst aufgenommen.

1. Wenn die Einstellung erfolgreich ist, fordert Client B den Server auf, den Schlüsselwert festzulegen bedeutet, dass die Sperre fehlgeschlagen ist.

3. Client A schließt die Ausführung des Codes ab und löscht die Sperre 4. Die Einstellung ist erfolgreich. Client B schließt die Ausführung des Codes ab und löscht die Sperre

$redis->setNX($key, $value);
$redis->expire($key, $ttl);
Nach dem Login kopieren

Spezifische Verwendung:

redis> SETNX keyName value
(integer) 1
Nach dem Login kopieren

Befehlserklärung:

key: key ist der Schlüsselwert von Redis als Identifikation der Sperre , und Wert wird hier als Identifikation des Clients verwendet. Nur wenn der Schlüsselwert übereinstimmt, kann er gelöscht werden. Das Recht zum Sperren [Garantiesicherheit]

max-lock-time. Stellen Sie die Ablaufzeit bis max-lock-time ein, um sicherzustellen, dass kein Deadlock auftritt [Deadlock vermeiden]

< code>NX: Der Vorgang wird nur ausgeführt, wenn der Schlüssel nicht vorhanden ist, falls er nicht vorhanden ist ;

EX: Stellen Sie die Ablaufzeit des Schlüssels auf Sekunden ein. Die spezifische Zeit wird durch 5 Parameter bestimmt

$redis->set($key, $value, array(&#39;nx&#39;, &#39;ex&#39; => $ttl));  //ex表示秒
Nach dem Login kopieren

luaScript Diese Zeichenfolge ist ein Lua-Skript. Das heißt, wenn der auf der Grundlage des Schlüssels erhaltene Wert mit dem eingehenden Wert übereinstimmt, führen Sie einfach del aus, andernfalls wird 0 zurückgegeben [Sicherheit gewährleisten]

    jedis.eval(String, Liste , list); Dieser Befehl dient zum Ausführen des Lua-Skripts. Der Satz von KEYS ist der dritte Parameter. [Garantierter atomarer Betrieb des Entsperrens]
  • Das Obige zeigt, wie Redis korrekt verwendet wird Es gibt jedoch einen kleinen Fehler, der darin besteht, dass die Ablaufzeit der Sperre auf einen geeigneten Wert eingestellt werden sollte. key:key就是redis的key值作为锁的标识,value在这里作为客户端的标识,只有key-value都比配才有删除锁的权利【保证安全性】

  • max-lock-time:通过max-lock-time设置过期时间保证不会出现死锁【避免死锁】

  • NX:只有这个key不存才的时候才会进行操作,if not exists;

  • EX

Das obige ist der detaillierte Inhalt vonWelche Möglichkeiten gibt es, Redis zu sperren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
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