用redis队列做秒杀。
首先创建一个入列push.php
<?php
//实例化redis对象
$redis = new redis();
//连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
$redis->connect('127.0.0.1', 6379);
//入队列
$num = 110;
for($i = 0;$i<$num;$i++){
$uid = $i+1;
$redis->lpush('user', $uid);
}
//写一个死循环用来判断结果
while (true) {
//守护进程是否将所有订单处理完毕
//scard查看集合的元素个数 等于100相当于库存的商品全部被秒杀出去了
if ($redis->scard('sUser') == 100) {
//获取抢购成功的用户名单
//SMEMBERS命令返回集合中的所有的成员
$orderTureUser = $redis->SMEMBERS('sUser');
//lrange查看列表所有值
//获取为抢购成功的用户名单
$orderFalseUser = $redis->lrange('user',0,-1);
foreach ($orderTureUser as $key => $value) {
echo 'id为'.$value.'抢购成功'. "\r\n";
}
foreach ($orderFalseUser as $key => $value) {
echo 'id为'.$value.'抢购失败'. "\r\n";
}
//满足条件后停止循环
break;
}
}
?>
在创建一个出列pop.php文件
<?php
//实例化redis对象
$redis = new redis();
//连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
$redis->connect('127.0.0.1', 6379);
//定义一个变量用来存储商品数量
$num = 0;
//循环取值
while (true) {
//redis取值
$uid = $redis->rpop('user');
//判断取出来的UID又没有值
if ($uid > 0) {
//有值
//create order 生成用户对应的订单
echo 'order created for user ' . $uid . "\r\n";
//这里用集合的操作,因为集合里面的元素是唯一的,限制用户重复抢购
$redis->sadd('sUser' , $uid); //抢购成功的用户id
//如果有值的话num会++
$num++;
} else {
//无值
//insert log
echo 'no uid ' . "\r\n";
}
//如果num值大于等于100那么循环终止,循环次数是看秒杀多少件商品来变的,这里的话我就定义了100次
if ($num >= 100) {
break;
}
}
?>
ok!有了这两个文件之后,到文件位置,我们输入命令先启动pop文件
php pop.php
出现下图那么就代表成功了
再启动push.php
php push.php
之前的pop.php监听到变化,自动退出循环
命令行启动的push界面就会变成下图模样。由于我们设置了110个用户进行抢购,只有一百个商品。当然id大于100的用户就抢不到了。
参考相关
1.https://blog.csdn.net/weixin_39278982/article/details/81216416