• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > PHP高并发实例详解之商品库存超卖并发测试

PHP高并发实例详解之商品库存超卖并发测试

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了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

最终结论 并发挑战 优先 redis 性能好

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 怎么解决PHP高并发(商品秒杀)问题?两种解决方案分享
  • PHP高并发实例详解之商品库存超卖并发测试
  • PHP高并发实例详解之解决商品库存超卖问题

相关文章

  • 2022-04-29Photoshop绘制超酷的3D门牌艺术字教程
  • 2022-04-29利用画笔及描边路径制作漂亮的金色树叶字
  • 2022-04-29PHPCMS V9后台复制指定文章到同模型的指定栏目中
  • 2022-04-29小程序swiper轮播CSS3动画及跳转到指定swiper-item的使用
  • 2022-04-29Photoshop制作梦幻炫彩光斑文字效果教程
  • 2022-04-29一张图搞定如何在PhpStorm中修改类文件头部作者
  • 2022-04-29PHP数组去重的5种方法有哪些?
  • 2022-04-29深入浅析vue3+vite中怎么使用svg图标
  • 2022-04-29谈谈CSS实现水平垂直居中布局的方法
  • 2022-04-29微信小程序按顺序同步执行的两种方式分别是什么

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • PHPCMS如何判断该栏目是否含有子栏目?
    • 解决WordPress评论加强:防止游客冒充站长回复别人的办法
    • vue element el-transfer增加拖拽功能
    • PHPCMS V9 文章列表循环样式自定义方法
    • 一文带你PHP利用phpmailer实现邮件发送功能
    • PhotoShop制作简单的炫光残破文字效果教程
    • nginx报错502怎么办?解决方案分享
    • Illustrator绘制超酷效果的立体字教程
    • CSS对SEO有影响吗
    • 解决LNMP环境无法彻底删除原网站目录文件夹的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有