下面由laravel教程欄目給大家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('stock_test', function (Blueprint $table) { $table->increments('id'); ????????????$table->integer('stock')->default(0)->comment('庫存1'); ????????????$table->timestamps(); ????????}); ????} ????/** ?????*?Reverse?the?migrations. ?????* ?????*?@return?void ?????*/ ????public?function?down() ????{ ????????Schema::dropIfExists('stock_test'); ????} }
代碼
$model?=?new?AppModelsStockTest(); $id?=?$request->input('id',1); try?{ ????//?手動開始事務 ????DB::beginTransaction(); ????//?sql加共享鎖,stock字段減1。返回成功表示成功,返回失敗表示自減失敗。stock字段是無符號的 ????$is?=?DB::table('stock_test')->lockForUpdate()->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
? 版權聲明
文章版權歸作者所有,未經(jīng)允許請勿轉載。
THE END