Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung von Redis, das sekundäres Schreiben bei großer Parallelität verhindert
PHP ruft Redis auf, um Lese- und Schreibvorgänge durchzuführen. Wenn kein Inhalt vorhanden ist, wird Folgendes angezeigt: Lesen Sie Schlüssel1. Bei großer Parallelität schreiben jedoch mehrere PHP-Prozesse gleichzeitig Dieses Mal muss eine Sperre hinzugefügt werden, d. h. der PHP-Prozess, der die Sperre erhält, hat die Berechtigung zum Schreiben.
$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: Legen Sie den Schlüssel einer Sperre fest. Setnx ist eine atomare Operation. Nur ein Prozess kann erfolgreich schreiben. Der Schreibvorgang gibt dann true zurück (was anzeigt, dass die Sperrberechtigung erhalten wurde). Schreiben Sie den Inhalt und geben Sie dann die Sperre frei. Das heißt, Sie löschen den Sperrschlüssel. 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 vonDetaillierte Erläuterung von Redis, das sekundäres Schreiben bei großer Parallelität verhindert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!