laravel高并發(fā)之抽獎秒殺解決方案

下面由laravel教程欄目給大家laravel高并發(fā)之抽獎秒殺解決方案,希望對需要的朋友有所幫助!

laravel高并發(fā)之抽獎秒殺解決方案

測試

  • 1.8核16G的服務器Jmeter并發(fā)2000

注意

不要在一臺機子上測,因為網(wǎng)絡的原因,本機上測并發(fā)1000不用鎖也是正常的。可以在阿里云買臺測試機

1.mysql共享鎖版

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

遷移文件

<?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration;  class CreateStockTestTable extends Migration {     /**      * Run the migrations.      *      * @return void      */     public function up()     {         Schema::create(&#39;stock_test&#39;, function (Blueprint $table) {             $table->increments('id'); ????????????$table-&gt;integer('stock')-&gt;default(0)-&gt;comment('庫存1'); ????????????$table-&gt;timestamps(); ????????}); ????}  ????/** ?????*?Reverse?the?migrations. ?????* ?????*?@return?void ?????*/ ????public?function?down() ????{ ????????Schema::dropIfExists('stock_test'); ????} }

代碼

$model?=?new?AppModelsStockTest(); $id?=?$request-&gt;input('id',1);  try?{ ????//?手動開始事務 ????DB::beginTransaction(); ????//?sql加共享鎖,stock字段減1。返回成功表示成功,返回失敗表示自減失敗。stock字段是無符號的 ????$is?=?DB::table('stock_test')-&gt;lockForUpdate()-&gt;increment('stock',-1); ????if($is) ????{ ????????log_info('id='.$id.'庫存減1'); ????????//?提交事務 ????????DB::commit(); ????????return?response('成功',200); ????} ????else ????{ ????????return?response('失敗',201); ????} }?catch?(Exception?$exception)?{ ????//?回滾事務 ????DB::rollBack(); ????return?response('失敗',201); }

2.reids隊列

  • 1.lpush加入隊列
  • 2.lpop彈窗隊列,成功返回對應值,不存在返回NULL

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享