Heim  >  Artikel  >  Datenbank  >  Wie viele Arten von Sperren gibt es in Redis?

Wie viele Arten von Sperren gibt es in Redis?

anonymity
anonymityOriginal
2019-06-05 10:00:243142Durchsuche

Redis-Sperrklassifizierung

Die Sperrbefehlstabellen, die von Redis verwendet werden können, sind INCR, SETNX, SET

Wie viele Arten von Sperren gibt es in Redis?

Der erste Sperrbefehl INCR

Die Idee dieser Art der Sperrung besteht darin, dass, wenn der Schlüssel nicht existiert, der Wert des Schlüssels auf 0 initialisiert wird Zuerst wird die INCR-Operation plus eins ausgeführt.

Wenn dann andere Benutzer die INCR-Operation ausführen, um eine hinzuzufügen, bedeutet dies, dass die zurückgegebene Zahl größer als 1 ist, dass die Sperre verwendet wird.

    1、 客户端A请求服务器获取key的值为1表示获取了锁
    2、 客户端B也去请求服务器获取key的值为2表示获取锁失败
    3、 客户端A执行代码完成,删除锁
    4、 客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功
    5、 客户端B执行代码完成,删除锁
    $redis->incr($key);
    $redis->expire($key, $ttl); //设置生成时间为1秒

Die zweite Art von Schloss SETNX

Die Idee dieser Art der Verriegelung besteht darin, dass, wenn der Schlüssel nicht vorhanden ist, der Schlüssel auf gesetzt wird Wert

Wenn der Schlüssel bereits vorhanden ist, ergreift SETNX keine Aktion

    1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
    2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
    3、 客户端A执行代码完成,删除锁
    4、 客户端B在等待一段时间后在去请求设置key的值,设置成功
    5、 客户端B执行代码完成,删除锁
    $redis->setNX($key, $value);
    $redis->expire($key, $ttl);

Der dritte Sperrtyp SET

Die beiden oben genannten Es gibt ein Problem mit der Methode. Sie werden feststellen, dass alle den Ablauf des Schlüssels festlegen müssen. Warum müssen wir 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. Daher müssen wir der Sperre eine Ablaufzeit hinzufügen, um Unfälle zu verhindern.

Aber das Festlegen mit Expire ist keine atomare Operation. Daher kann die Atomizität auch durch Transaktionen sichergestellt werden, es gibt jedoch immer noch einige Probleme, weshalb der Beamte ab Version 2.6.12 die Funktion zum Festlegen der Ablaufzeit in den SET-Befehl selbst einbezieht.

    1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
    2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
    3、 客户端A执行代码完成,删除锁
    4、 客户端B在等待一段时间后在去请求设置key的值,设置成功
    5、 客户端B执行代码完成,删除锁
    $redis->set($key, $value, array('nx', 'ex' => $ttl));  //ex表示秒

Das obige ist der detaillierte Inhalt vonWie viele Arten von Sperren gibt es in Redis?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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