Die Beispiele in diesem Artikel beschreiben verschiedene Implementierungsmethoden zur Lösung von Parallelitätsproblemen in der PHP-Entwicklung und geben sie als Referenz an alle weiter.
Bei Parallelitätsszenarien wie Produktanstürmen kann es zu Überverkäufen kommen. Zu diesem Zeitpunkt ist es notwendig, die durch Parallelität verursachten Probleme zu lösen.
Es gibt keine native Bereitstellung in der PHP-Sprache, die Parallelitätslösungen erfordert andere Möglichkeiten, Parallelitätskontrolle zu erreichen.
Option 1: Exklusive Dateisperre verwenden
Die Flockfunktion wird verwendet, um die Sperre der Datei zu erhalten Kann nur von einem Thread erworben werden, andere Threads, die die Sperre nicht erworben haben, werden entweder blockiert oder die Erfassung schlägt fehl.
Wenn der Bestand größer als 0 ist, fragen Sie zuerst den Bestand ab und geben Sie eine Bestellung auf Reduzieren Sie den Bestand. Geben Sie dann die Sperre frei
Option 2: Verwenden Sie die pessimistische Sperre der MySQL-Datenbank
Innodb-Speicher-Engine Unterstützt Sperren auf Zeilenebene. Wenn die Zeilendaten gesperrt sind, können andere Prozesse die Zeilendaten nicht verarbeiten.
Zeile zuerst abfragen und sperren:
select stock_num from table where id=1 for update if(stock_num > 0){ //下订单 update table set stock_num=stock-1 where id=1 }
Option 3: Warteschlange verwenden
Speichern Sie die Bestellanfragen des Benutzers nacheinander in einer Warteschlange und verwenden Sie einen separaten Prozess im Hintergrund, um die Bestellanfragen in der Warteschlange zu verarbeiten
Option 4: Verwenden Sie Redis
Redis-Vorgänge sind alle atomar. Sie können den Warenbestand in Redis speichern, bevor Sie eine Bestellung aufgeben, wenn der zurückgegebene Wert größer als oder ist gleich 0, Sie können eine Bestellung aufgeben. Auf diese Weise können Sie keine Bestellung aufgeben.
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }
Andere Parallelitätsprobleme:
In realen Anwendungen werden in vielen Fällen Daten im Cache gespeichert. Wenn der Cache ausfällt, rufen Sie die Datenbank auf, um Daten abzurufen und den Cache zurückzusetzen. Wenn die Parallelität zu diesem Zeitpunkt groß ist, werden viele Prozesse ausgeführt Die Datenbank muss gleichzeitig Daten abrufen, was dazu führt, dass viele Anfragen
in die Datenbank eindringen und einen Datenbankabsturz verursachen. Zur Lösung kann hier eine Dateisperre verwendet werden
$data = $cache->get('key'); if(!$data){ $fp = fopen('lockfile'); if(flock($fp, LOCK_EX)){ $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了 if(!$data){ $data = mysql->query(); $cache->set('key', $data); } flock($fp, LOCK_UN); } fclose($fp); }
Um es ganz klar auszudrücken: Sperren ist notwendig, um Parallelitätsprobleme zu lösen.
Verwandte Lektüre:
MySQL Redis-Lernen und -Anwendung
Implementierung des Redis-Transaktionsmechanismus und der optimistischen Sperrmethode
Das obige ist der detaillierte Inhalt vonAnalyse mehrerer Implementierungsmethoden zur Lösung von Parallelitätsproblemen in der PHP-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!