thinkphp mysql高并发_thinkphp高并发抢购代码测试-解决高并发下的超卖问题!

本文探讨了两种解决高并发下超卖问题的抢购方案。第一种利用MySQL的unsigned字段限制,当库存减少至负数时自动避免超卖。第二种方案采用Redis作为库存队列,通过LPOP操作实现库存同步减少,确保并发安全性。
摘要由CSDN通过智能技术生成

下面测试2种抢购实现方案

首先数据库中一个很简单的表

DROP TABLE IF EXISTS `op_qiang`;

CREATE TABLE `op_qiang` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`num` int(8) unsigned NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `op_qiang` (`id`, `num`) VALUES

(1,10);

op_qiang这个表中 ID为1的商品 库存数量为10

第一种方案 将mysql中,num这个字段 设置为 unsigned 表示这个字段不能为负数,如果减库存为负数了就会返回flase总而解决超卖问题。

//抢购 通过 mysql 字段设置 设为unsigned, 实现

public function sqla(){

$f = db('qiang')->where('id',1)->find();

$t = mt_rand(100,999999);

if($f['num']<=0){

exit("over");

}

$re = db('qiang')->where('id',1)->setDec('num',1);

if($re){

//模拟抢到了的客户,写入操作逻辑

file_put_contents('log.txt',$t."---ok\r\n",FILE_APPEND);

}else{

file_put_contents('log.txt',$t."--\r\n",FILE_APPEND);

}

}

用ab模拟测试, ab -r -n 1000 -c 500  http://192.168.1.112/index.php/index/index/sqla  代码运行正常!

下面用redis测试

//首先redis中将库存加入队列,

public function dos()

{

$redis = new \Redis();

$redis->connect('127.0.0.1', 6379);//serverip port

$count = 10;//redis中加入 列表 的数量  表示库存

$res=$redis->llen('goods_store');

echo $res;

for($i=0;$i

$redis->lpush('goods_store',1);

}

echo $redis->llen('goods_store');

}

//抢购环节 读取队列,队列没有了,表示抢购已经完成,没有库存了

public function sqlb(){

$redis = new \Redis();

$redis->connect('127.0.0.1', 6379);//serverip port

$count=$redis->lpop('goods_store');

echo $count;

if(!$count){

exit("over");

}

$re = db('qiang')->where('id',1)->setDec('num',1);//减库存

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值