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

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

测试

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

注意

不要在一台机子上测,因为网络的原因,本机上测并发1000不用锁也是正常的。可以在阿里云买台测试机

1.mysql共享锁版

sql加共享锁,stock字段减1。返回成功表示成功,返回失败表示自减失败。stock字段是无符号的

迁移文件

<?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('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 \App\Models\StockTest(); $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
flowchart 箭头图标 勿删

以上就是laravel高并发之抽奖秒杀解决方案的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:Laravel 分布式唯一 ID 生成器使用

相关资讯