激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - PHP教程 - php處理?yè)屬?gòu)類功能的高并發(fā)請(qǐng)求

php處理?yè)屬?gòu)類功能的高并發(fā)請(qǐng)求

2019-10-22 11:05春風(fēng)不及你的笑 PHP教程

這篇文章主要為大家詳細(xì)介紹了php處理?yè)屬?gòu)類功能的高并發(fā)請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文以搶購(gòu)、秒殺為例。介紹如何在高并發(fā)狀況下確保數(shù)據(jù)正確。 
在高并發(fā)請(qǐng)求下容易參數(shù)兩個(gè)問題 
1.數(shù)據(jù)出錯(cuò),導(dǎo)致產(chǎn)品超賣。 
2.頻繁操作數(shù)據(jù)庫(kù),導(dǎo)致性能下降。

測(cè)試環(huán)境

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

通常處理方法

從控制器可以看出代碼思路。先查詢商品庫(kù)存。如果庫(kù)存大于0 ,則庫(kù)存減少1,同時(shí)生產(chǎn)訂單,錄入搶購(gòu)者數(shù)據(jù)。

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

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

      // 秒殺信息入庫(kù)
      $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 '未能成功搶購(gòu)!';
      }else{
        echo '恭喜你,訂單<b>'.$order.'</b>搶購(gòu)成功';
      }

    }else{
      echo '已被搶購(gòu)一空!';
    }
  }

將商品庫(kù)存設(shè)置為20后,通過(guò)ab 配置200的并發(fā)請(qǐng)求。

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

執(zhí)行結(jié)果發(fā)現(xiàn)庫(kù)存變成了負(fù)值,商品超賣了。 

php處理?yè)屬?gòu)類功能的高并發(fā)請(qǐng)求

原因比較簡(jiǎn)單,在高并發(fā)請(qǐng)求下。在生產(chǎn)訂單,減少庫(kù)存之前,會(huì)優(yōu)先查詢到庫(kù)存結(jié)果。

優(yōu)化一:修改庫(kù)存數(shù)據(jù)類型

第一種優(yōu)化方法,從數(shù)據(jù)庫(kù)入手。既然查詢到的結(jié)果不準(zhǔn)確,那我就在庫(kù)存減少上做手腳。將庫(kù)存的數(shù)據(jù)類型改成無(wú)符號(hào)(不能有負(fù)值)。 

代碼還是跟上面差不多,只是在庫(kù)存減1的地方做了個(gè)判斷。避免報(bào)錯(cuò)。

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

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

      // 秒殺信息入庫(kù)
      $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 '未能成功搶購(gòu)!';
      }else{
        echo '恭喜你,訂單<b>'.$order.'</b>搶購(gòu)成功';
      }

    }else{
      echo '已被搶購(gòu)一空!';
    }
  }

這一次同樣200的并發(fā),執(zhí)行結(jié)果發(fā)現(xiàn)。數(shù)據(jù)正確,并不會(huì)出現(xiàn)超賣的情況。 
思路其實(shí)也比較簡(jiǎn)單。因?yàn)閹?kù)存不能為負(fù)值,當(dāng)庫(kù)存等于0時(shí),如果還有值傳進(jìn)來(lái),則會(huì)報(bào)錯(cuò)。請(qǐng)求被終止。

這種優(yōu)化方式,雖然避免了商品超賣的情況。但是在另一方面,請(qǐng)求仍然會(huì)對(duì)數(shù)據(jù)庫(kù)造成壓力。如果多個(gè)功能使用此數(shù)據(jù)庫(kù),會(huì)造成性能下降厲害。

優(yōu)化二:redis

利用 redis list類型的pop的原子性。在操作數(shù)據(jù)庫(kù)前,做一個(gè)驗(yàn)證。當(dāng)商品賣完后,就不允許再繼續(xù)進(jìn)行數(shù)據(jù)庫(kù)操作。

 

// redis list 高并發(fā)測(cè)試
  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 "笨蛋!已經(jīng)被搶光啦!";
      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 '未能成功搶購(gòu)!';
    }else{
      echo '恭喜你,訂單<b>'.$order.'</b>搶購(gòu)成功';
    }
  }
  // 給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();

  }

這點(diǎn)的代碼,我寫了兩個(gè)方法。第一個(gè)方法是秒殺的代碼,第二個(gè)方法是給秒殺的商品設(shè)置數(shù)量。為了方便測(cè)試,我這里處理的比較簡(jiǎn)單。

通過(guò)測(cè)試,數(shù)據(jù)庫(kù)生產(chǎn)的訂單數(shù)量正常,并沒有出現(xiàn)問題。而又避免了請(qǐng)求數(shù)據(jù)庫(kù)造成性能下降的問題。同時(shí)內(nèi)存數(shù)據(jù)庫(kù)redis查詢的速度要比mysql快很多。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧洲成人综合网 | 国产精品久久久久久久av | av久草| 欧美日韩免费一区 | 亚洲成人网一区 | 一级黄色片在线看 | 中国产一级毛片 | 欧美一级高潮 | 精品一区二区免费 | 国产精品久久亚洲 | 免费黄网站在线播放 | 亚州综合图片 | 国产精品久久久久久久久久 | 91看片成人| 欧美在线观看黄色 | 欧美在线观看视频一区二区 | 毛片118极品美女写真 | 国产人成免费爽爽爽视频 | 午夜久久久精品一区二区三区 | 亚洲网站在线观看 | 国内一区 | 羞羞视频入口 | 91成人影院 | 神秘电影91 | 在线亚洲观看 | 国产精品视频导航 | 成人区一区二区 | 中国美女一级黄色片 | 久久国产亚洲视频 | 青青草免费观看 | hdjapanesemassagehd日本 | 国产一级毛片a | 91在线视频在线观看 | 九九热视频这里只有精品 | 一区www| 国产免费一区二区三区视频 | 九九热国产视频 | 高颜值美女啪啪 | 成年人观看免费视频 | 精品国产一区二区三区四 | 毛片在线视频观看 |