Die üblichen Sperrbefehle von Redis sind INCR, SETNX, SET
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
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.
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]
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!