redis 队列实现秒杀/抢购

消息队列的应用场景例如:秒杀、抢单功能。

下面写个Demo简单实现一下秒杀,也就是抢购。

首先创建一个lpush.html文件,代码如下:



   
        TODO supply a title
       
       
       
       
   
   
       

       

       

       

       

       

       

       

       

       

       

       

   

 

然后在创建一个lpush.php文件用来处理数据,这个文件里头的内容呢就是执行入队操作,代码如下:

    //实例化redis对象
    $redis = new redis();
    //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
    $redis->connect('127.0.0.1', 6379);
    //接收ajax传来的值,请看lpush.html
    $uid = $_GET['uid'];
    //入队列
    $redis->lpush('tv', $uid);
    //写一个死循环用来判断结果
    while (true) {
        //守护进程是否将所有订单处理完毕
        if ($redis->scard('tvuser') == 5) {
            //判断当前用户是否有对应的订单
            if ($redis->sismember('tvuser' , $uid)) {
                $flag = 1;
            } else {
                $flag = 0;
            }
            //返回给页面
            echo $flag;
            //满足条件后停止循环
            break;
         }
     }
?>
最后在创建一个守护进程的文件pop.php,这个文件里头的主要内容就是去队列里头的值并且返回人数是否已够,代码如下:

    //实例化redis对象
    $redis = new redis();
    //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
    $redis->connect('127.0.0.1', 6379);
    //定义一个变量用来存储循环次数
    $num = 0;
    //循环取值
    while (true) {
        //每隔一秒取一次
        sleep(1);
        //redis取值
        $uid = $redis->rpop('tv');
        //判断取出来的UID又没有值
        if ($uid > 0) {
            //有值
            //create order 生成用户对应的订单
            echo 'order created for user ' . $uid . "\r\n";
            $redis->sadd('tvuser' , $uid); //抢购成功的用户id
            //如果有值的话num会++
            $num++;
        } else {
            //无值
            //insert log
            echo 'no uid ' . "\r\n";
        }
        //如果num值大于等于5那么循环终止,循环次数是看秒杀多少件商品来变的,这里的话我就定义了5次
        if ($num >= 5) {
            break;
        }
    }
?>

我们在执行守护进程之前可以先把redis里的数据清空一下,以免扰乱程序执行结果,命令如下:

效果就是这个样子的,在秒杀开始之前要先启动守护进程,命令效果如下:

redis 队列实现秒杀/抢购_第1张图片

然后守护进程启动之后,前台就可以来进行秒杀了。浏览器上访问你的lpush.html,由于我们后台设定的商品数为5,那么只能五个用户抢购成功,第6个用户就会提示失败,如下图:

redis 队列实现秒杀/抢购_第2张图片

原文:https://blog.csdn.net/weixin_39278982/article/details/81216416 

 

你可能感兴趣的:(redis 队列实现秒杀/抢购)