laravel高并发之抽奖秒杀解决方案

下面由laravel教程栏目给大家laravel高并发之抽奖秒杀解决方案,希望对需要的朋友有所帮助!

laravel高并发之抽奖秒杀解决方案

测试

  • 1.8核16G的服务器Jmeter并发2000

注意

不要在一台机子上测,因为网络的原因,本机上测并发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 分享