<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 開發(fā)商城會遇到商品賣的超出預設?創(chuàng)新互聯(lián)教你如何更改

            2023-11-09    分類: 網(wǎng)站建設

            原始方案(失?。涸诿看蜗掠唵吻拔覀兣袛啻黉N商品的數(shù)量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大于0的商品的庫存,當時我們使用ab進行壓力測試,當并發(fā)超過500,訪問量超過2000時,還是會出現(xiàn)超賣現(xiàn)象。

            public function buyOne()
            {
                $shop = Shop::find(1);
                if ($shop->number > 0) {
                    Db::update("update shop set number = number - 1 where id = 1");
                }
            }

            第1種方案:使用mysql的事務加排他鎖來解決,首先我們選擇數(shù)據(jù)庫的存儲引擎為innoDb,使用的是排他鎖實現(xiàn)的,剛開始的時候我們測試了下共享鎖,發(fā)現(xiàn)還是會出現(xiàn)超賣的現(xiàn)象。有個問題是,當我們進行高并發(fā)測試時,對數(shù)據(jù)庫的性能影響很大,導致數(shù)據(jù)庫的壓力很大。

            //2.利用數(shù)據(jù)庫的forupdate來加鎖(在數(shù)量少的情況下并不會出現(xiàn)問題,但是當并發(fā)達到(ab -n 1000 -c 200),
            //就會出現(xiàn)請求非2XX的響應增多,1000 失敗了 60)time per request 65.195
            //在高并發(fā)的情況下,會導致數(shù)據(jù)庫連接數(shù)不夠,部分php獲取不到連接而報錯,或者是超過等待時間而報錯

            public function indexMysql()
            {
              Db::beginTransaction();
              //通過for update 加排它鎖
              $shop = Db::table('shop')->where('id', '=', 1)->lockForUpdate()->first();
              if ($shop->number > 0) {
                if (Db::update("update shop set number = number - 1 where id = 1")) {
                  Db::commit();
                } else {
                  Db::rollback();//回滾并重試
                  usleep(100000);
                  $this->indexMysql();
                }
              } else {
                Db::commit();
              }
            }

            第2種方案:使用文件鎖實現(xiàn)。當用戶搶到一件促銷商品后先觸發(fā)文件鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得I/O開銷很大。

            第3種方案:使用redis的setnx來實現(xiàn)鎖機制。但是并發(fā)大的情況下,鎖的爭奪會變多,導致響應越來越慢。(與第四種方案類似)

            //在數(shù)量少的情況下并不會出現(xiàn)問題,但是當并發(fā)達到(ab -n 1000 -c 200 就會出現(xiàn)請求非2XX的響應增多,1000 失敗了 54) time per request 127.575

            public function index()
            {
              //測試并發(fā)超賣現(xiàn)象
              if (Redis::setnx(self::KEY, 1)) {//拿到了鎖
                $this->buy();
              } else {
                usleep(100000);//等會再去拿鎖
                //Log::info("未爭奪到鎖,睡眠100ms");
                $this->index();
              }
            }
            private function buy()
            {
              $shop = Shop::find(1);
              if ($shop->number > 0) {
                $shop->number --;
                $shop->save();
              }
              Redis::del(self::KEY);
            }

            第4種方案:redis的隊列來實現(xiàn)。將要促銷的商品數(shù)量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數(shù)據(jù),確保商品不會超賣。這個操作起來很方便,而且效率極高

            //4.使用redis隊列來,用戶過來直接入隊列,然后再將操作更新到數(shù)據(jù)庫
            //最佳體驗(redis pconnect 9.481s, 無丟失, 無框架)

            public function push()
            {
              //入隊列
              Redis::lpush(self::QUEUE, 1);
            }

            //腳本調用pop方法 * * * * * php xxx.php

            public function pop(){    while (($key = Redis::rpop(self::QUEUE))) {      $shop = Shop::find(1);      if ($shop->number > 0) {        Db::update("update shop set number = number - 1 where id =         1")     }  }
            }

            分享標題:開發(fā)商城會遇到商品賣的超出預設?創(chuàng)新互聯(lián)教你如何更改
            轉載來于:http://www.jbt999.com/news44/293294.html

            成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司、外貿建站、關鍵詞優(yōu)化網(wǎng)站改版、虛擬主機App設計

            廣告

            聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

            成都seo排名網(wǎng)站優(yōu)化

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 日本黄色电影网站视频 | 在线视频a| 自拍偷拍成人视频 | 成人免费黄色网址 | 操批免费视频 |