Heim  >  Artikel  >  Datenbank  >  Welche Möglichkeiten gibt es, Redis zu sperren?

Welche Möglichkeiten gibt es, Redis zu sperren?

WBOY
WBOYnach vorne
2023-05-27 12:43:061426Durchsuche

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秒

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

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);

Spezifische Verwendung:

redis> SETNX keyName value
(integer) 1

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]

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('nx', 'ex' => $ttl));  //ex表示秒

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen