Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse mehrerer Implementierungsmethoden zur Lösung von Parallelitätsproblemen in der PHP-Entwicklung

Analyse mehrerer Implementierungsmethoden zur Lösung von Parallelitätsproblemen in der PHP-Entwicklung

*文
*文Original
2017-12-21 16:24:131366Durchsuche

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

MySQL-Datenbank Optimierung (3) – MySQL-pessimistische Sperre und optimistische Sperre (Parallelitätskontrolle)

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!

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