Maison >développement back-end >Problème PHP >Comment gérer une concurrence élevée en PHP

Comment gérer une concurrence élevée en PHP

王林
王林original
2019-09-20 17:53:343161parcourir

Comment gérer une concurrence élevée en PHP

Sécurité des données sous haute concurrence

Nous savons que lorsque plusieurs threads écrivent dans le même fichier, la « sécurité des threads » existera (plusieurs threads exécutez le même morceau de code en même temps. Si le résultat de chaque exécution est le même que celui d'une exécution à un seul thread et que le résultat est le même que celui attendu, il est thread-safe).

S'il s'agit d'une base de données MySQL, vous pouvez utiliser son propre mécanisme de verrouillage pour résoudre le problème. Cependant, dans les scénarios de concurrence à grande échelle, MySQL n'est pas recommandé. Il existe un autre problème dans les scénarios de vente flash et de vente urgente, à savoir la « livraison excessive ». Si cet aspect n'est pas soigneusement contrôlé, une livraison excessive se produira.

Nous avons également entendu dire que certaines sociétés de commerce électronique mènent des activités d'achat précipitées. Une fois que l'acheteur a réussi à prendre la photo, le commerçant ne reconnaît pas la commande comme valide et refuse de livrer la marchandise. Le problème ici n’est peut-être pas nécessairement que le commerçant est traître, mais qu’il est causé par le risque de surémission au niveau technique du système.

1. Raisons de la livraison excessive

Supposons que dans un scénario d'achat précipité, nous n'ayons que 100 produits au total, et qu'au dernier moment, nous ayons consommé 99 produits. Il ne reste que le dernier. À ce moment-là, le système a envoyé plusieurs demandes simultanées. Les soldes de produits lus par ces demandes étaient tous de 99, puis ils ont tous rendu ce jugement de solde, ce qui a finalement conduit à une émission excessive. (Identique à la scène mentionnée plus tôt dans l'article)

Comment gérer une concurrence élevée en PHP

2. Verrouillage optimiste

Le verrouillage optimiste est utilisé par rapport au "verrouillage pessimiste" verrouillage" Les mécanismes de verrouillage plus détendus utilisent principalement les mises à jour de version. L'implémentation est que toutes les demandes concernant ces données peuvent être modifiées, mais un numéro de version des données sera obtenu. Seules celles avec des numéros de version cohérents pourront être mises à jour avec succès, et les autres demandes échoueront.

Dans ce cas, nous n'avons pas besoin de considérer le problème de file d'attente, mais cela augmentera la surcharge de calcul du processeur. Cependant, dans l’ensemble, c’est une meilleure solution.

Comment gérer une concurrence élevée en PHP

Il existe de nombreux logiciels et services qui prennent en charge la fonction de « verrouillage optimiste », comme watch dans Redis en fait partie. Avec cette implémentation, nous garantissons la sécurité des données.

Solution d'optimisation : regarder dans Redis

<?php
$redis = new redis();
 $result = $redis->connect(&#39;127.0.0.1&#39;, 6379);
 echo $mywatchkey = $redis->get("mywatchkey");
/*
  //插入抢购数据
 if($mywatchkey>0)
 {
     $redis->watch("mywatchkey");
  //启动一个新的事务。
    $redis->multi();
   $redis->set("mywatchkey",$mywatchkey-1);
   $result = $redis->exec();
   if($result) {
      $redis->hSet("watchkeylist","user_".mt_rand(1,99999),time());
      $watchkeylist = $redis->hGetAll("watchkeylist");
        echo "抢购成功!<br/>";
        $re = $mywatchkey - 1;  
        echo "剩余数量:".$re."<br/>";
        echo "用户列表:<pre class="brush:php;toolbar:false">";
        print_r($watchkeylist);
   }else{
      echo "手气不好,再抢购!";exit;
   } 
 }else{
     // $redis->hSet("watchkeylist","user_".mt_rand(1,99999),"12");
     //  $watchkeylist = $redis->hGetAll("watchkeylist");
        echo "fail!<br/>";   
        echo ".no result<br/>";
        echo "用户列表:<pre class="brush:php;toolbar:false">";
      //  var_dump($watchkeylist); 
 }*/
$rob_total = 100;   //抢购数量
if($mywatchkey<=$rob_total){
    $redis->watch("mywatchkey");
    $redis->multi(); //在当前连接上启动一个新的事务。
    //插入抢购数据
    $redis->set("mywatchkey",$mywatchkey+1);
    $rob_result = $redis->exec();
    if($rob_result){
         $redis->hSet("watchkeylist","user_".mt_rand(1, 9999),$mywatchkey);
        $mywatchlist = $redis->hGetAll("watchkeylist");
        echo "抢购成功!<br/>";
      
        echo "剩余数量:".($rob_total-$mywatchkey-1)."<br/>";
        echo "用户列表:<pre class="brush:php;toolbar:false">";
        var_dump($mywatchlist);
    }else{
          $redis->hSet("watchkeylist","user_".mt_rand(1, 9999),&#39;meiqiangdao&#39;);
        echo "手气不好,再抢购!";exit;
    }
}
?>

Le contenu ci-dessus est à titre de référence uniquement !

Tutoriel recommandé : Tutoriel vidéo PHP

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!

Déclaration:
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