PHP商品库存超卖并发测试实例分析
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍"PHP商品库存超卖并发测试实例分析",在日常操作中,相信很多人在PHP商品库存超卖并发测试实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PHP
千家信息网最后更新 2025年01月19日PHP商品库存超卖并发测试实例分析
这篇文章主要介绍"PHP商品库存超卖并发测试实例分析",在日常操作中,相信很多人在PHP商品库存超卖并发测试实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PHP商品库存超卖并发测试实例分析"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、 普通下单
并发测试时 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab -n 30 -c 10 http://xxxxx.top/code/the_limit/add_order.php
结果:
有 15 次库存减少成功 store 库存出现了负数 -7 8 次判断为库存不够 (库存负数是不正确的 不允许的)
二、unsigned 模式
调整回 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab -n 30 -c 10 http://xxxxx.top/code/the_limit/unsigned.php
结果:
有 15 次库存减少成功 store 库存出现了负数 -6 9 次判断为库存不够 (库存负数是不正确的 不允许的)
仅在查询语句上 加 for update 加锁效果不大
三、mysql 的事务,锁住操作的行
调整回 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab -n 30 -c 10 http://xxxxx.top/code/the_limit/ACID.php
结果:
有 15 次库存减少成功 store 库存未出现负数 15 次判断为库存不够 (库存负数是不正确的 不允许的)
加事务 效果不错 ab -n 3000 -c 1000 并发也能扛住
四、 非阻塞的文件排他锁
阻塞形式
非阻塞形式
效果也没有出现负数 但性能上 事务 > 阻塞 > 非阻塞
五、 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 * from products where id={$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 = new mysqli('localhost','root','PASSWORD','dev'); if (!$con) { echo "数据库连接失败"; } $product_id = 1;// 商品ID $buy_num = 1;// 购买数量 sleep(1); $sql = "update products set store=store-{$buy_num} where id={$product_id}"; if (mysqli_query($con, $sql)) { echo "秒杀完成"; insertLog('恭喜 秒杀成功'); }} else { insertLog('抱歉 秒杀失败'); exit('抢购失败');}function db(){ global $con; $con = new mysqli('localhost','root','WOrd1234.*','dev'); if (!$con) { echo "数据库连接失败"; }}/** * 记录日志 */function insertLog($content){ global $con; $sql = "INSERT INTO `order_log` (content) values('$content')"; mysqli_query($con, $sql);}ab -n 30 -c 10 http://xxxxxx.top/code/the_limit/optimistic\ _redis_lock.php
到此,关于"PHP商品库存超卖并发测试实例分析"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
库存
负数
商品
成功
测试
阻塞
实例
实例分析
分析
事务
学习
不够
大米
总数
效果
稻花
稻花香
结果
调整
乐观
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库 转义字符
互联网诞生的科技
浙江服务器硬盘报价
东土科技代表工业互联网
2019网络安全考shi
华为服务器多长时间维修一次
苏州麦禾田网络技术
网络安全知识体系图
杭州呈美网络技术有限公司
军队网络安全教育讨论
苏州高科技软件开发注意事项
潮州自主可控软件开发供应商
国资委网络安全事件应急预案
数据库原理及应用 事务
通行数据库
关于网络安全的策划书
软件开发怎么设置试用期
数据库连接密钥
数据库 会话什么意思
我的世界服务器网易版预告
统一软件开发品质保障
联合国术语数据库
我的世界服务器怎么调相机
数据库采集更新制度
微信申请添加好友服务器繁忙
重庆地图软件开发平台
计算机网络技术是计算机
山东万辰互联网科技
泗洪网络技术
实时数据库技术标准