在之前的文章《PHP高并发实例详解之解决商品库存超卖问题》中,我们讲到了关于在高并发情况下防止商品库存超卖的相关问题,下面我们一起来看一下防止库存超卖之并发测试的相关内容,希望对大家有帮助。
基于《PHP高并发实例详解之解决商品库存超卖问题》的测试案例
一、 普通下单
并发测试时 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab-n30-c10http://xxxxx.top/code/the_limit/add_order.php
结果:
有 15 次库存减少成功 store 库存出现了负数 -7 8 次判断为库存不够 (库存负数是不正确的 不允许的)
二、unsigned 模式
调整回 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab-n30-c10http://xxxxx.top/code/the_limit/unsigned.php
结果:
有 15 次库存减少成功 store 库存出现了负数 -6 9 次判断为库存不够 (库存负数是不正确的 不允许的)
仅在查询语句上 加 for update 加锁效果不大
三、mysql 的事务,锁住操作的行
调整回 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab-n30-c10http://xxxxx.top/code/the_limit/ACID.php
结果:
有 15 次库存减少成功 store 库存未出现负数 15 次判断为库存不够 (库存负数是不正确的 不允许的)
加事务 效果不错 ab -n 3000 -c 1000 并发也能扛住
四、 非阻塞的文件排他锁
阻塞形式
非阻塞形式
效果也没有出现负数 但性能上 事务 > 阻塞 > 非阻塞
五、 redis 队列
代码与之前 略有调整 乐观锁版
<?php$redis=newRedis();$redis->connect("127.0.0.1",6379);$redis->auth('PASSWORD');$redis->watch('sales');//乐观锁监视作用set()初始值0$sales=$redis->get('sales');//var_dump($sales);exit;db();global$con;//查询商品信息//$product_id=1;//$sql="select*fromproductswhereid={$product_id}";//$result=mysqli_query($con,$sql);//$row=mysqli_fetch_assoc($result);//$store=$row['store'];//库存$n=15;if($sales>=$n){insertLog('库存为0秒杀失败');exit('秒杀结束');}//redis开启事务$redis->multi();$redis->incr('sales');//将key中储存的数字值增一,如果key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。$res=$redis->exec();//成功1失败0if($res){//秒杀成功$con=newmysqli('localhost','root','PASSWORD','dev');if(!$con){echo"数据库连接失败";}$product_id=1;//商品ID$buy_num=1;//购买数量sleep(1);$sql="updateproductssetstore=store-{$buy_num}whereid={$product_id}";if(mysqli_query($con,$sql)){echo"秒杀完成";insertLog('恭喜秒杀成功');}}else{insertLog('抱歉秒杀失败');exit('抢购失败');}functiondb(){global$con;$con=newmysqli('localhost','root','WOrd1234.*','dev');if(!$con){echo"数据库连接失败";}}/***记录日志*/functioninsertLog($content){global$con;$sql="INSERTINTO`order_log`(content)values('$content')";mysqli_query($con,$sql);}ab-n30-c10http://xxxxxx.top/code/the_limit/optimistic\_redis_lock.php
最终结论 并发挑战 优先 redis 性能好
产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;
日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉;
本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;
部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入;
如若转载,请注明出处:https://www.chanpinyuan.cn/30218.html;