Heim  >  Artikel  >  Backend-Entwicklung  >  Mehrere Implementierungen von PHP zur Lösung von Parallelitätsproblemen

Mehrere Implementierungen von PHP zur Lösung von Parallelitätsproblemen

不言
不言Original
2018-04-19 15:06:002529Durchsuche

Dieser Artikel stellt mehrere Implementierungen von PHP zur Lösung von Parallelitätsproblemen vor. Er hat einen gewissen Referenzwert. Jetzt können Freunde in Not darauf zurückgreifen.

Für Parallelitätsszenarien wie Produktanstürme In dieser Situation kann es zu einem Überverkauf kommen.

Es gibt keine native Parallelitätslösung in der PHP-Sprache, daher müssen Sie andere Methoden verwenden.

Option 1: Exklusive Dateisperre verwenden

Die Flock-Funktion wird verwendet, um die Dateisperre gleichzeitig zu erwerben. Andere Threads können dies nicht tun Die erworbene Sperre wird entweder gesperrt oder die Erfassung schlägt fehl. Fragen Sie beim Erwerb der Sperre zunächst den Lagerbestand ab, geben Sie eine Bestellung auf, reduzieren Sie den Lagerbestand und geben Sie dann die Sperre auf


Option 2: Verwenden Sie die pessimistische Sperre der MySQL-Datenbank

Die Innodb-Speicher-Engine unterstützt Sperren auf Zeilenebene, wenn eine Datenzeile gesperrt ist , andere Prozesse können die Datenzeile nicht bearbeiten

Zuerst die Zeile abfragen und sperren: Wählen Sie stock_num aus der Tabelle mit der ID=1 für die Aktualisierung aus

Option 3: Warteschlange verwenden
if(stock_num > 0){
//下订单
update table set stock_num=stock-1 where id=1
}

um die Bestellanfragen des Benutzers nacheinander in einer Warteschlange im Hintergrund zu speichern. Verwenden Sie einen separaten Prozess, um Bestellanfragen in der Warteschlange zu verarbeiten.


Option 4: Verwenden Sie Redis

Redis-Vorgänge sind alle atomar und die Ware kann in Redis gespeichert werden. Führen Sie vor der Bestellung eine Dekretoperation für den Lagerbestand durch. Wenn der zurückgegebene Wert größer oder gleich 0 ist, kann die Bestellung ausgeführt werden Andernfalls kann die Bestellung nicht aufgegeben werden.

if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}


Andere Parallelitätsprobleme:

In vielen Fällen Wenn der Cache ausfällt, rufen Sie die Datenbank auf, um die Daten abzurufen, und setzen Sie den Cache zurück. Wenn das Volumen gleichzeitig sehr groß ist, werden viele Prozesse in die Datenbank abgerufen Dies führt dazu, dass viele Anfragen

in die Datenbank eindringen und zum Absturz der Datenbank führen. Zur Lösung dieses Problems können Dateisperren verwendet werden




[php]

einfach anzeigenkopieren


$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. Die Essenz verschiedener Lösungen ist Sperren

Verwandt Empfehlungen:

PHP löst das Problem des Verlusts beim Posten großer Datenmengen

PHP löst das Blockieren von Sitzungsdateien

PHP löst JSON-Chinesisch-Anzeigeproblem

Das obige ist der detaillierte Inhalt vonMehrere Implementierungen von PHP zur Lösung von Parallelitätsproblemen. 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