TP框架的商品秒杀(redis缓存队列)

5 篇文章 0 订阅

详情访问个人网站:http://www.ouxiaoxian.top/?p=115

流程:

1.访问产品前先将当前产品库存队列(点击商品的时候,要将商品存入redis中)

2.处理当前会员是否进入队列(下单时候判断会员是否在redis队列中)

注:我做的是商品直播的时候秒杀,如果做整点秒杀,将下面的时间的start_time,end_time改成固定时间

 

    //    将redis的信息封装函数
    public function connectRedis()
    {
        $redis = new \Redis();
        $redis->connect('127.0.0.1',6379);
        $redis->auth('xinglian272');
        return $redis;
    }

    /**
     * 访问产品前先将当前产品库存队列 1.当前秒杀已经结束2.系统繁忙,请稍后再试3.当前产品已经秒杀完
     * @access public
     *  wang
     * 2019/3/9
     */
    public function goods_redis($param){
        $goods_id = $param['goods_id'];
        if($goods_id){
            $goods_list_user = "goods_".$goods_id."_user";//当前商品队列的用户情况
            $goods_list_num = "goods".$goods_id;//当前商品的库存队列
        }
        $where['goods_id'] = $goods_id;
        $where['start_time'] = array("lt",time());
        $where['end_time'] =  array("gt",time());
        $goods = M("miao_goods")->where($where)->field('goods_num,start_time,end_time')->find();
//        判断时间是否满足条件
        if(empty($goods)){
            return array('Code' =>'0','Msg'=>'no','Data'=>'当前秒杀已经结束2');
        }
//        dump($goods_list_user);die;
        if($goods['goods_num'] > $goods['order_num']){
            $redis = $this->connectRedis();
            $getUserRedis = $redis->hGetAll("$goods_list_user");
//            dump(count($getUserRedis));die;
            $gnRedis = $redis->llen("{$goods_list_num}");
            /* 如果没有会员进来队列库存 */
            if(!count($getUserRedis) && !$gnRedis){
                for ($i = 0; $i < $goods['goods_num']; $i ++) {
                    $redis->lpush("{$goods_list_num}", 1);
                }
            }
            $resetRedis = $redis->llen("{$goods_list_num}");
            if(!$resetRedis){
                return array('Code' =>'0','Msg'=>'no','Data'=>'系统繁忙,请稍后再试');
            }
            return array('Code' =>'0','Msg'=>'ok','Data'=>'成功');
        }else{
            return array('Code' =>'0','Msg'=>'no','Data'=>'当前产品已经秒杀完');
        }

    }

    /**
     * 抢购商品前处理当前会员是否进入队列
     * @access public
     * wang
     */
    public function goods_number_order($param){
//        $param['uid']='358';
        $goods_id = $param['goods_id'];
        if($goods_id){
            $goods_list_user = "goods_".$goods_id."_user";//当前商品队列的用户情况
            $goods_list_num = "goods".$goods_id;//当前商品的库存队列
        }
//        判断用户是否有uid传入
        if(empty($param['uid'])){
            return array('Code' =>'0','Msg'=>'no','Data'=>'用户uid为空');
        }
        $model = M("miao_goods");
        $where['goods_id'] = $goods_id;
        $goods_info = $model->where($where)->find();
        if(empty($goods_info)){return array('Code' =>'0','Msg'=>'no','Data'=>'对不起,当前商品不存在或已下架');}
        /* redis 队列 */
        $redis = $this->connectRedis();
        /* 进入队列  */
        $goods_number_key = $redis->llen("{$goods_list_num}");
        if (!$redis->hGet("{$goods_list_user}", $param['uid'])) {
            $goods_number_key = $redis->lpop("{$goods_list_num}");
        }
        if($goods_number_key){
            // 判断用户是否已在队列
            if (!$redis->hGet("{$goods_list_user}", $param['uid'])) {
                // 插入抢购用户信息
                $userinfo = array(
                    "user_id" => $param['uid'],
                    "create_time" => time()
                );
                $redis->hSet("{$goods_list_user}", $param['uid'], serialize($userinfo));
                return array('Code' =>'0','Msg'=>'OK','Data'=>'成功');
            }else{
//            如果redis存储了用户信息
                return array('Code' =>'0','Msg'=>'OK','Data'=>'成功');
            }

        }else{
            return array('Code' =>'0','Msg'=>'no','Data'=>'系统繁忙,请重试');
        }
    }

http://www.cnblogs.com/bieanju/p/6225722.html

http://www.cnblogs.com/qqlong/p/9327844.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值