redis队列秒杀demo

1 篇文章 0 订阅

用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值