生产者
实际上秒杀是有活动时间限制,需要把活动时间、活动状态、数量、产品ID等信息整合到redis中,根据前端过来的产品ID直接获取对应产品信息
// 模拟用户id
$userid = rand(1000, 99999);
// 秒杀最大数量
$max = 100;
// 限购
if ($redis->hExists('hash_miaosha_11011', $userid)) {
echo '每人限购一件';exit;
}
// 秒杀完了
if ($redis->hLen('hash_miaosha_11011') >= $max || ) {
echo '秒杀结束了';exit;
}
// 抢购队列
$redis->lPush('miaosha_11011', $userid);
// 已参与队列,已参与的人不能重复参与
$redis->hSet('hash_miaosha_11011', $userid, $userid);
echo '抢到了!';exit;
消费者
在确认秒杀或者活动结束后,消费完所有队列,需要把使用了的redis队列、哈希、产品信息进行移除(后台定时器去检测活动信息,在完全结束后,从redis中移除所有信息)
// 模拟消费队列
while ($userid = $redis->rPop('miaosha_11011')) {
// 已成功购买的不能重复购买,对可能出现的漏网之鱼二次过滤
if ($redis->hExists('hash_success_miaosha_11011', $userid)) {
break;
}
// do something...
// 订单入库
// 购买成功队列
$redis->hSet('hash_success_miaosha_11011', $userid, 0);
}