本地模拟redis实现抢购
复习一下redis相关的队列抢购。
实现思路:
准备两个队列A和B,假设A队列的名称为stock,用于存放商品总库存信息,B队列的名称为users,用于存放抢购成功后的用户信息。每当有用户进行抢购操作时,先从A队列弹出一个元素,如果该元素有值,说明还有剩余库存,此时,将用户信息存入B队列,否则,说明已无库存,应该终止抢购。
<?php stock.php
/**
* Created by PhpStorm.
* User: Hurrian
* Date: 2021/7/16
* Time: 14:47
*/
// 秒杀开始前,将库存放入redis队列中
$redis = new Redis();
$redis->connect('127.0.0.1','6379');
// 假设秒杀总库存为500
$stock = 5;
// 待秒杀的商品编号
$goodsId = 1000001;
// 将商品库存依次放入队列中
for ($i=0; $i<$stock; $i++) {
$redis->lPush('stock_' . $goodsId, 1);
$redis->setTimeout('stock_' . $goodsId,60);
}
开始抢购商品:
<?php
/**
* Created by PhpStorm.
* User: Hurrian
* Date: 2021/7/16
* Time: 14:47
*/
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$goodsId = 1000001;
//假如有10个用户
$users = 10;
$i = 0;
for ($i == 0;$i<=$users;$i++){
// 从队列左侧弹出一个元素,如果有值,说明还有剩余库存
$rs = $redis->lpop('stock_'.$goodsId);
if (!$rs) {
echo '售罄了!用户'.$i;
echo '<br/>';
// 输出最终抢购成功的用户数量
echo '最终抢购人数:'.$users.' 人';
echo '<br/>';
echo '<br/>';
return;
} else {
// 将抢购成功的用户存入队列
$redis->lPush('users',$i);
echo '恭喜您!用户'.$i;
}
echo '<br/>';
}
附上订单号生成方法:
public function orderNo()
{
return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
输出:

龙卷风之殇

浙公网安备 33010602011771号