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

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

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了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高并发实例详解之解决商品库存超卖问题

相关文章

  • HTML用JS导出Excel的五种方法
  • MySQL主键还需要建立索引吗?
  • 解决并分析Incorrect datetime value报错问题
  • PS打造线描风格舞者壁纸平面作品设计制作教程
  • array_values()在php中返回数组的操作实例
  • thinkphp5 redis缓存新增方法实例讲解
  • jQuery url中文乱码怎么办
  • Laravel中三种中间件的作用
  • Photoshop设计超酷的连体艺术字教程
  • PHP中子类如何调用父类的静态方法

文章分类

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

最近更新的内容

    • PHP网站常见安全漏洞,及相应防范措施总结
    • WordPress图片显示模糊的问题
    • PS+AI打造一个中国风字体LOGO设计过程教程
    • 帝国cms忘记后台登录认证码和安全问题的解决方法
    • 关于出现“对不起,您安装的不是正版应用..”的解决办法
    • 小程序学习之浅析image标签、swiper组件
    • 浅析Vue中的Vue.set和this.$set,看看使用场景!
    • 7B2主题美化之右上角投稿美化+加上搜索
    • 如何解决mysql 5.6 中文 乱码问题
    • 搜索引擎优化的文章营销策略

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

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