首頁 >php框架 >Laravel >laravel高併發之抽獎秒殺解決方案

laravel高併發之抽獎秒殺解決方案

藏色散人
藏色散人轉載
2020-06-18 13:34:214828瀏覽

下面由Laravel教學專欄給大家laravel高並發之抽獎秒殺解決方案,希望對需要的朋友有所幫助!

laravel高併發之抽獎秒殺解決方案

測試

  • <span style="font-size: 16px;"></span><span style="font-size: 16px;"></span><span style="font-size: 16px;"></span><span style="font-size: 16px;"></span>#1.<span style="font-size: 16px;"></span>8核心16G<span style="font-size: 16px;"></span>#的伺服器

Jmeter<span style="font-size: 16px;"></span>

並發

2000<span style="font-size: 16px;"></span>#注意

不要在一桌上型電腦上測,因為網路的原因,本機上測並發

1000

<span style="font-size: 16px;"></span>不用鎖也是正常的。可以在阿里雲買台測試機

<span style="font-size: 16px;"></span>1.mysql共享鎖版

<span style="font-size: 16px;"></span>

sql加上共享鎖,stock字段減1。返回成功表示成功,返回失敗表示自減失敗。 stock欄位是無符號的

<span style="font-size: 16px;"></span>

    「遷移檔案
  • <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateStockTestTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create(&#39;stock_test&#39;, function (Blueprint $table) {
                $table->increments(&#39;id&#39;);
                $table->integer(&#39;stock&#39;)->default(0)->comment(&#39;库存1&#39;);
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists(&#39;stock_test&#39;);
        }
    }
    <span style="font-size: 16px;"></span>#
    $model = new \App\Models\StockTest();
    $id = $request->input(&#39;id&#39;,1);
    
    try {
        // 手动开始事务
        DB::beginTransaction();
        // sql加共享锁,stock字段减1。返回成功表示成功,返回失败表示自减失败。stock字段是无符号的
        $is = DB::table(&#39;stock_test&#39;)->lockForUpdate()->increment(&#39;stock&#39;,-1);
        if($is)
        {
            log_info(&#39;id=&#39;.$id.&#39;库存减1&#39;);
            // 提交事务
            DB::commit();
            return response(&#39;成功&#39;,200);
        }
        else
        {
            return response(&#39;失败&#39;,201);
        }
    } catch (\Exception $exception) {
        // 回滚事务
        DB::rollBack();
        return response(&#39;失败&#39;,201);
    }
    2.reids佇列
  • <span style="font-size: 16px;"></span>1.<span style="font-size: 16px;"></span>#lpush<span style="font-size: 16px;"></span>加入佇列<span style="font-size: 16px;"></span>##2.
lpop 彈跳視窗,成功傳回對應值,不存在回傳##null ###########################

以上是laravel高併發之抽獎秒殺解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除