文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP商品库存超卖并发测试实例分析

2023-06-29 22:17

关注

这篇文章主要介绍“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 队列

代码与之前 略有调整 乐观锁版

<?php$redis =new Redis();$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商品库存超卖并发测试实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯