TP框架的商品秒殺(redis緩存隊列)

流程:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章