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 verwendenif(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
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 DatenmengenPHP löst das Blockieren von SitzungsdateienPHP löst JSON-Chinesisch-AnzeigeproblemDas 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!