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 失败0

if ($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 性能好

PHP中mysql_connect()函数不支持怎么办

原创2022-04-06 15:36:031218 + php学习QQ群:609135716

方法:1、打开“php.ini”文件;2、搜索“pdo_mysql”和“curl”,将“;extension=php_curl.dll”和“;extension=pdo_mysql.dll”前面的“;”删除;3、重启apache服务器即可。

php高并发测试:防止库存超卖的案例讲解

千万级数据并发如何处理?进入学习

本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。

PHP中mysql_connect()函数不支持怎么办

mysql_connect()函数是一个php与mysql数据库连接函数,如果你的php不支持mysql_connect()函数就是你的数据库不能与mysql连接了,下面我来总结一下解决mysql_connect()不能使用的方法。

mysql_connect()不支持的原因是php的扩展没有配置好

mysql_connect()不支持的解决方法:

1、打开php.ini文件:

2、搜索pdo_mysql和curl

;extension=php_curl.dll
;extension=pdo_mysql.dll

然后把2者前面的;去掉;

在系统的 system32(C:/windows/system32)目录下缺少libmysql.dll文件,解决方法是找到php目录下的libmysql.dll,并将libmysql.dll复制到C:/ windows/system32目录中,然后重新启动Web服务。

在C:/windows目录下的php.ini文件中,没有将“;extension=php_mysql.dll”中的前面一个“;”去掉,所以不能使用相应功能,解决方法是打开php.ini文件找到;extension=php_mysql.dll 改成

extension=php_mysql.dll //去掉前面的;使之生效

3、再重启iis或者apache服务器。

php高并发测试:防止库存超卖的案例讲解

推荐学习:mysql视频教程

以上就是PHP中mysql_connect()函数不支持怎么办的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/24414/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年9月21日 下午2:59
下一篇 2022年9月21日 下午3:01
软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!