本地模拟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);
}

  输出:

 

posted @ 2021-07-16 17:27  龙卷风之殇  阅读(82)  评论(0)    收藏  举报