前锋PHP的大并发集群技术,高并发下,php、swoole与redis实现的秒杀功能

这是一个关于如何使用Swoole的Channel特性在协程环境下构建高并发秒杀场景的示例。博客详细介绍了通过Channel进行库存同步,并在Redis中管理库存,配合数据库操作处理订单创建及库存扣减的过程,展示了在5000次请求并发1000的情况下,系统的处理逻辑。
摘要由CSDN通过智能技术生成

/**

* 改良版 利用swoole的Channel通道* 协程下 秒杀案例(5000次请求 并发1000) ab -n 5000 -c 1000 http://192.168.99.100:9555/order/skill

* @throws \Psr\Container\ContainerExceptionInterface

* @throws \Psr\Container\NotFoundExceptionInterface

*/

public function skill()

{

$container = ApplicationContext::getContainer();

$redis = $container->get(Redis::class);

co(function () use ($redis) {

$chan = new Channel(1);

co(function () use ($chan, $redis) {

$key = 'sku_id';

$count = $redis->lPop($key);

$chan->push($count);

});

co(function () use ($chan, $redis) {

$chanData = $chan->pop();

if (!$chanData) {

$this->log('库存为0,已售罄', 0);

} else {

$sku_id = 11;

// 插入订单

$order_sn = getIdGenerator();

$data = [

'order_sn' => $order_sn,

'user_id' => 1,

'goods_id' => 1,

'sku_id' => 11,

'price' => 10

];

$sql2 = "update mall_test_store set number=number-1 where sku_id='{$sku_id}'";

if (Db::table('test_order')->insert($data) && DB::update($sql2)) {

$this->log('下单成功', 1);

} else {

$this->log('下单失败', -1);

}

}

});

});

}

// 设置redis

private function setkey($key, $count)

{

$container = ApplicationContext::getContainer();

$redis = $container->get(Redis::class);

for ($i = 0; $i < $count; $i++) {

$redis->lPush($key, 1);

}

}

//记录日志

private function log($event, $type = 0)

{

$sql = "insert into mall_test_log(event,type)values('{$event}','{$type}')";

Db::insert($sql);

var_dump($event);

}

// 初始化所有变量

public function clean()

{

$sku_id = 11;

Db::delete("truncate table mall_test_log");

Db::delete("truncate table mall_test_order");

Db::update("update mall_test_store set number=1000 where sku_id='{$sku_id}'");

// 在redis中设置一下sku的数量。

$this->setkey('sku_id', 1000);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值