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

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

小云云
小云云Original
2018-03-27 13:30:591265Durchsuche

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.

  1. $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 den Schlüssel einer Sperre, setnx ist eine atomare Operation, nur ein Prozess kann erfolgreich schreiben und der Schreibvorgang gibt true zurück (bedeutet: Erhalten Sie die Sperrberechtigung), schreiben Sie dann den Inhalt und geben Sie dann die Sperre frei, 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:

  1. $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 vonWie verwendet PHP Redis, 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