Heim  >  Artikel  >  Backend-Entwicklung  >  PHP verwendet Redis, um Methoden zu implementieren, um sekundäres Schreiben bei großer Parallelität zu verhindern

PHP verwendet Redis, um Methoden zu implementieren, um sekundäres Schreiben bei großer Parallelität zu verhindern

黄舟
黄舟Original
2017-10-10 09:16:531733Durchsuche

Dieser Artikel stellt hauptsächlich die Methode vor, mit der PHP Redis verwendet, um sekundäres Schreiben bei großer Parallelität zu verhindern. Er analysiert die Lese- und Schreibfehler, wenn PHP den Sperrmechanismus verwendet, um das gleichzeitige Lesen und Schreiben von Redis zu implementieren Wenn Sie es benötigen, können Sie darauf verweisen.

Das Beispiel in diesem Artikel beschreibt, wie PHP Redis verwendet, um sekundäres Schreiben bei großer Parallelität zu verhindern. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

PHP ruft Redis auf, um Lese- und Schreibvorgänge auszuführen. Bei großer Parallelität wird Folgendes angezeigt: Lesen Sie Schlüssel1 und schreiben Sie den Inhalt, wenn kein Inhalt vorhanden ist Bei großer Parallelität treten jedoch mehrere gleichzeitige Vorgänge auf. Beim Schreiben durch den PHP-Prozess muss zu diesem Zeitpunkt eine Sperre hinzugefügt werden, d. h. der PHP-Prozess, der die Sperre erhält, verfügt über die Schreibberechtigung.


$lock_key = 'LOCK_PREFIX' . $redis_key;
$is_lock = $redis->setnx($lock_key, 1); // 加锁
if($is_lock == true){ // 获取锁权限
  $redis->setex($redis_key, $expire, $data); // 写入内容
  // 释放锁
  $redis->del($lock_key);
}else{
  return true; // 获取不到锁权限,直接返回
}

Die Idee ist: Setzen Sie einen Sperrschlüssel, setnx ist eine atomare Operation, nur ein Prozess kann erfolgreich schreiben, und der Schreibvorgang ist erfolgreich erfolgreich true zurückgegeben (was bedeutet, die Sperrberechtigung zu erhalten), dann den Inhalt schreiben und dann die Sperre freigeben, um den Sperrschlüssel zu löschen. Prozesse, die die Sperre nicht erhalten können, kehren direkt zurück. Es gibt jedoch eine Situation, in der der Prozess, der die Sperrberechtigung erhält, beim Ausführen nach Erhalt der Sperre einen Fehler meldet. Daher wird die Sperre nicht aufgehoben und der Inhalt kann nicht geschrieben werden Um die Sperrberechtigung zu erhalten, muss die verbleibende Gültigkeitszeit der Sperre beurteilt werden. Wenn sie -1 ist, legen Sie die effektive Zeit der Sperre auf 5 Sekunden fest (5 Sekunden sind für die Laufzeit des Prozesses reserviert, der die Sperre erhält). ist genug). Verbesserter Code:


$lock_key = 'LOCK_PREFIX' . $redis_key;
$is_lock = $redis->setnx($lock_key, 1); // 加锁
if($is_lock == true){ // 获取锁权限
  $redis->setex($redis_key, $expire, $data); // 写入内容
  // 释放锁
  $redis->del($lock_key);
}else{
  // 防止死锁
  if($redis->ttl($lock_key) == -1){
    $redis->expire($lock_key, 5);
  }
  return true; // 获取不到锁权限,直接返回
}

Das obige ist der detaillierte Inhalt vonPHP verwendet Redis, um Methoden zu implementieren, um sekundäres Schreiben bei großer Parallelität zu verhindern. 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