久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

php處理搶購類功能的高并發請求

這篇文章主要為大家詳細介紹了php處理搶購類功能的高并發請求,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文以搶購、秒殺為例。介紹如何在高并發狀況下確保數據正確。
在高并發請求下容易參數兩個問題
1.數據出錯,導致產品超賣。
2.頻繁操作數據庫,導致性能下降。

測試環境

Windows7
apache2.4.9
php5.5.12
php框架 yii2.0
工具 apache bench (apache自帶高并發請求工具)。

通常處理方法

從控制器可以看出代碼思路。先查詢商品庫存。如果庫存大于0 ,則庫存減少1,同時生產訂單,錄入搶購者數據。

// 常規代碼處理高并發
  public function actionNormal(){
    // 查詢庫存
    $stock = Goods::find()->select('stock')->where(['goods_id'=>100001])->asArray()->one();
    // 判斷該商品是否還有庫存
    if ($stock['stock']>0) {
      // 庫存減一
      Goods::updateAllCounters(['stock' => -1],['goods_id'=>100001]);

      // 生產訂單(另外功能,暫且隨機賦值)
      $order = $this->build_order();

      // 秒殺信息入庫
      $model = new Highly();
      $model->order_id = $order;
      $model->goods_name = '秒殺商品';
      $model->buy_time = date('Y-m-d H:i:s',time());
      $model->mircrotime = microtime(true);
      if($model->save()===false){
        echo '未能成功搶購!';
      }else{
        echo '恭喜你,訂單<b>'.$order.'</b>搶購成功';
      }

    }else{
      echo '已被搶購一空!';
    }
  }

將商品庫存設置為20后,通過ab 配置200的并發請求。

ab -n 200 -c 200 http//localhost/highly/normal

執行結果發現庫存變成了負值,商品超賣了。

php處理搶購類功能的高并發請求

原因比較簡單,在高并發請求下。在生產訂單,減少庫存之前,會優先查詢到庫存結果。

優化一:修改庫存數據類型

第一種優化方法,從數據庫入手。既然查詢到的結果不準確,那我就在庫存減少上做手腳。將庫存的數據類型改成無符號(不能有負值)。

代碼還是跟上面差不多,只是在庫存減1的地方做了個判斷。避免報錯。

public function actionNormal(){
    // 查詢庫存
    $stock = Goods::find()->select('stock')->where(['goods_id'=>100001])->asArray()->one();
    // 判斷該商品是否還有庫存
    if ($stock['stock']>0) {
      // 庫存減一
      if(Goods::updateAllCounters(['stock' => -1],['goods_id'=>100001])===false){
        echo "已被搶購一空!";
        return false;
      }

      // 生產訂單(另外功能,暫且隨機賦值)
      $order = $this->build_order();

      // 秒殺信息入庫
      $model = new Highly();
      $model->order_id = $order;
      $model->goods_name = '秒殺商品';
      $model->buy_time = date('Y-m-d H:i:s',time());
      $model->mircrotime = microtime(true);
      if($model->save()===false){
        echo '未能成功搶購!';
      }else{
        echo '恭喜你,訂單<b>'.$order.'</b>搶購成功';
      }

    }else{
      echo '已被搶購一空!';
    }
  }

這一次同樣200的并發,執行結果發現。數據正確,并不會出現超賣的情況。
思路其實也比較簡單。因為庫存不能為負值,當庫存等于0時,如果還有值傳進來,則會報錯。請求被終止。

這種優化方式,雖然避免了商品超賣的情況。但是在另一方面,請求仍然會對數據庫造成壓力。如果多個功能使用此數據庫,會造成性能下降厲害。

優化二:redis

利用 redis list類型的pop的原子性。在操作數據庫前,做一個驗證。當商品賣完后,就不允許再繼續進行數據庫操作。

// redis list 高并發測試
  public function actionRedis(){
    $redis = \Yii::$app->redis;
    // $redis->lpush('mytest',1);
    $order = $this->build_order();
    // echo $order;die;
    // echo $redis->llen('mytest');
    $reg = $redis->lpop('mytest');
    if (!$reg) {
      echo "笨蛋!已經被搶光啦!";
      return false;
    }
    $redis->close();
    $model = new Highly();
    $model->order_id = $order;
    $model->goods_name = '秒殺商品';
    $model->buy_time = date('Y-m-d H:i:s',time());
    $model->mircrotime = microtime(true);

    if($model->save()===false){
      echo '未能成功搶購!';
    }else{
      echo '恭喜你,訂單<b>'.$order.'</b>搶購成功';
    }
  }
  // 給redis添加商品
  public function actionInsertgoods(){
    $count = yii::$app->request->get('count',0);
    if (empty($count)) {
      echo '大兄弟,你還沒告訴我需要上架多少商品呢!';
      return false;
    }
    $redis = \Yii::$app->redis;
    for ($i=0; $i < $count; $i++) { 
      $redis->lpush('mytest',1);
    }
    echo '成功添加了'.$redis->llen('mytest').'件商品。';
    $redis->close();

  }

這點的代碼,我寫了兩個方法。第一個方法是秒殺的代碼,第二個方法是給秒殺的商品設置數量。為了方便測試,我這里處理的比較簡單。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP定義字符串的四種方式,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
下面小編就為大家分享一篇php 替換文章中的圖片路徑,下載圖片到本地服務器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP給源代碼加密的幾種方法匯總(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇php打開本地exe程序,js打開本地exe應用程序,并傳遞相關參數方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP類的反射來實現依賴注入過程以及相關知識點分享,對此有興趣的朋友跟著小編學習下吧。
php遍歷一個文件夾內的所有文件和文件夾,并刪除所有文件夾和子文件夾下的所有文件的代碼,通過遞歸方式實現達到清空一個目錄的效果。本文給大家分享實例代碼,需要的朋友參考
主站蜘蛛池模板: 夜夜夜久久久 | 亚洲不卡在线观看 | 国产一级视屏 | 国产成年人视频 | 日韩一 | 成人精品一区 | 成人国产精品久久 | 青青久久| 欧美国产日韩一区二区三区 | 一区二区三区高清 | 三级黄色网址 | 青青久久 | 日韩中文字幕在线不卡 | 欧美中文字幕一区二区三区亚洲 | 欧美精品一区二区在线观看 | 狠狠躁18三区二区一区 | 久久成人免费视频 | 精品国产一区二区久久 | 亚洲午夜精品视频 | 亚洲喷水 | 国产视频一视频二 | 亚洲一级视频在线 | av中文字幕网站 | 99精品欧美一区二区蜜桃免费 | 日韩在线播放视频 | 美女视频一区二区 | 国产免费观看一区 | 视频1区2区 | 黄视频网站免费观看 | 男人天堂99| 成人免费视频网站在线看 | 亚洲免费视频一区 | 中文在线一区 | 国产欧美一区二区三区在线播放 | 日本一区视频在线观看 | 99日韩| 久久久久久黄 | 成人毛片视频在线播放 | 欧美aaaaaaaaaa | 国产精品一区二区三区在线 | 日本在线视频不卡 |