Analyse de plusieurs méthodes d'implémentation pour résoudre les problèmes de concurrence dans le développement PHP

*文
Libérer: 2023-03-18 08:40:01
original
1327 Les gens l'ont consulté

Les exemples de cet article décrivent plusieurs méthodes d'implémentation pour résoudre les problèmes de concurrence dans le développement PHP et sont partagés avec tout le monde pour votre référence.

Dans des scénarios simultanés tels que l'achat précipité d'un produit, une survente peut se produire. À l'heure actuelle, il est nécessaire de résoudre les problèmes causés par la concurrence.

Il n'y a pas de disposition native dans les solutions de concurrence en langage PHP. nécessitent d’autres moyens pour réaliser le contrôle de concurrence.


Option 1 : Utiliser le verrouillage exclusif du verrouillage de fichier

La fonction flock est utilisée pour obtenir le verrouillage du fichier. ne peut être acquis que par un seul thread, les autres threads qui n'ont pas acquis le verrou bloqueront ou ne parviendront pas à acquérir le verrou

Lors de l'acquisition du verrou, interrogez d'abord l'inventaire. Si l'inventaire est supérieur à 0, placez-le. une commande et réduire l'inventaire. Puis relâchez le verrou


Option 2 : Utiliser le verrou pessimiste fourni par la base de données Mysql

Le moteur de stockage Innodb prend en charge les verrous au niveau des lignes. Lorsque les données de ligne sont verrouillées, les autres processus ne peuvent pas fonctionner sur les données de ligne.

Interrogez et verrouillez d'abord la ligne :

select stock_num from table where id=1 for update
    if(stock_num > 0){
    //下订单
    update table set stock_num=stock-1 where id=1
}
Copier après la connexion

<. 🎜>

Option 3 : Utiliser la file d'attente

Stockez les demandes de commande de l'utilisateur dans une file d'attente dans l'ordre et utilisez un processus distinct en arrière-plan pour traiter les demandes de commande dans la file d'attente

Option 4 : Utiliser Redis

Les opérations Redis sont toutes atomiques. Vous pouvez stocker l'inventaire des marchandises dans Redis avant de passer une commande, effectuez une opération de diminution sur l'inventaire si la valeur retournée est supérieure ou supérieure. égal à 0, vous pouvez passer une commande. Sinon, vous ne pouvez pas passer de commande. De cette façon Très efficace

if(redis->get(&#39;stock_num&#39;) > 0){
 stock_num = redis->decr(&#39;stock_num&#39;)
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}
Copier après la connexion


Autres problèmes de concurrence :

Dans les applications réelles, dans de nombreux cas, les données seront stockées dans le cache. Lorsque le cache échoue, accédez à la base de données pour récupérer les données et réinitialiser le cache. Si la concurrence est importante à ce moment-là, de nombreux processus y iront. la base de données pour récupérer des données en même temps, ce qui entraîne de nombreuses requêtes

pénétrant dans la base de données et provoquant un crash de la base de données, le verrouillage de fichier peut être utilisé pour résoudre le problème ici

$data = $cache->get(&#39;key&#39;);
if(!$data){
  $fp = fopen(&#39;lockfile&#39;);
  if(flock($fp, LOCK_EX)){
    $data = $cache->get(&#39;key&#39;);//拿到锁后再次检查缓存,这时可能已经有了
    if(!$data){
      $data = mysql->query();
      $cache->set(&#39;key&#39;, $data);
    }
    flock($fp, LOCK_UN);
  }
  fclose($fp);
}
Copier après la connexion

Pour parler franchement, le verrouillage est nécessaire pour résoudre les problèmes de concurrence. L'essence de diverses solutions est le verrouillage

Lecture connexe :

Apprentissage et application MySQL Redis

Implémentation du mécanisme de transaction Redis et de la méthode de verrouillage optimiste

Optimisation de la base de données MySQL (3) - Verrouillage pessimiste et optimiste MySQL (contrôle de concurrence)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!