Redis 秒杀

来源:互联网 发布:淘宝助理怎么关联打印 编辑:程序博客网 时间:2024/04/28 04:19

添加秒杀入库

  public function actionAdd_do()    {        $request = \Yii::$app->request;            $data = $request->post();//            print_r($data);die;            //存入redis list            $redis = new \redis();            $redis->connect('127.0.0.1',6379);        //商品库存(存key 时 加goods_id 是为了 不被混搅)            $redis->set("kill_num".$data['goods_id'],$data['num']);        //商品价格            $redis->set("kill_price".$data['goods_id'],$data['kill_price']);        //商品开始时间he结束时间            $redis->set("kill_time".$data['goods_id'],$data['status_time'].'_'.$data['die_time']);        //抢购列表(为空)            $redis->rPush("kill_goods".$data['goods_id'],"");        //秒杀商品 入库            $actAdd = \Yii::$app->db->createCommand()->insert('man_activity',[                'act_name'=>$data['act_name'],                'status_time'=>$data['status_time'],                'die_time'=>$data['die_time'],                'is_show'=>$data['is_show'],                'content'=>$data['content'],                'goods_id'=>$data['goods_id'],                'kill_price'=>$data['kill_price'],                'num'=>$data['num'],            ])->execute();            if($actAdd)            {                return $this->redirect('?r=activity/index');            }else            {                echo "添加失败";            }    }

前台网页设计


<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>秒杀活动</title></head><body><script src="./jquery.js"></script><script type="text/javascript">    $.extend($.fn,{        //懒人建站 http://www.51xuediannao.com/        fnTimeCountDown:function(d){            this.each(function(){                var $this = $(this);                var o = {                    hm: $this.find(".hm"),                    sec: $this.find(".sec"),                    mini: $this.find(".mini"),                    hour: $this.find(".hour"),                    day: $this.find(".day"),                    month:$this.find(".month"),                    year: $this.find(".year")                };                var f = {                    haomiao: function(n){                        if(n < 10)return "00" + n.toString();                        if(n < 100)return "0" + n.toString();                        return n.toString();                    },                    zero: function(n){                        var _n = parseInt(n, 10);//解析字符串,返回整数                        if(_n > 0){                            if(_n <= 9){                                _n = "0" + _n                            }                            return String(_n);                        }else{                            return "00";                        }                    },                    dv: function(){                        //d = d || Date.UTC(2050, 0, 1); //如果未定义时间,则我们设定倒计时日期是2050年1月1日                        var _d = $this.data("end") || d;                        var now = new Date(),                            endDate = new Date(_d);                        //现在将来秒差值                        //alert(future.getTimezoneOffset());                        var dur = (endDate - now.getTime()) / 1000 , mss = endDate - now.getTime() ,pms = {                            hm:"000",                            sec: "00",                            mini: "00",                            hour: "00",                            day: "00",                            month: "00",                            year: "0"                        };                        if(mss > 0){                            pms.hm = f.haomiao(mss % 1000);                            pms.sec = f.zero(dur % 60);                            pms.mini = Math.floor((dur / 60)) > 0? f.zero(Math.floor((dur / 60)) % 60) : "00";                            pms.hour = Math.floor((dur / 3600)) > 0? f.zero(Math.floor((dur / 3600)) % 24) : "00";                            pms.day = Math.floor((dur / 86400)) > 0? f.zero(Math.floor((dur / 86400)) % 30) : "00";                            //月份,以实际平均每月秒数计算                            pms.month = Math.floor((dur / 2629744)) > 0? f.zero(Math.floor((dur / 2629744)) % 12) : "00";                            //年份,按按回归年365天5时48分46秒算                            pms.year = Math.floor((dur / 31556926)) > 0? Math.floor((dur / 31556926)) : "0";                        }else{                            pms.year=pms.month=pms.day=pms.hour=pms.mini=pms.sec="00";                            pms.hm = "000";                            //alert('结束了');                            return;                        }                        return pms;                    },                    ui: function(){                        if(o.hm){                            o.hm.html(f.dv().hm);                        }                        if(o.sec){                            o.sec.html(f.dv().sec);                        }                        if(o.mini){                            o.mini.html(f.dv().mini);                        }                        if(o.hour){                            o.hour.html(f.dv().hour);                        }                        if(o.day){                            o.day.html(f.dv().day);                        }                        if(o.month){                            o.month.html(f.dv().month);                        }                        if(o.year){                            o.year.html(f.dv().year);                        }                        if(!parseInt(o.hour.html()) && !parseInt(o.mini.html()) && !parseInt(o.sec.html()))                        {//                            alert(123213);                            $('#btn').removeAttr('disabled');                            $('#box').html(' <P style="font-size:.8em;line-height:2em;">秒杀开始!</P>');                        }                        setTimeout(f.ui, 1);                    }                };                f.ui();            });        }    });</script><div id='box' style="background:rgb(183,17,41); margin-bottom: 50px;  WIDTH: 100%;  color:#fff;FONT-FAMILY: arial; TEXT-ALIGN: center;">    <P style="font-size:.8em;line-height:2em;">距活动开始还有:</P>    <div id="fnTimeCountDown" data-end="<?php echo $list['time']?>">        <span class="hour">00</span>时        <span class="mini">00</span>分        <span class="sec">00</span>秒    </div></div><script type="text/javascript">    $("#fnTimeCountDown").fnTimeCountDown("2017/03/09 9:00:00");</script><center>    <div><img src="123.jpg" alt="" width="400px" height="300px"><br>        名称:<?php echo $list['goods_name']?><br>        价格:<span id="price"><?php echo $list['price']?></span>元    </div>    <button id="btn" goods="<?php echo $list['id']?>" disabled="">秒杀</button></center></body></html><script>    $(function(){        if(!parseInt($('.hour').html()) &&  !parseInt($('.mini').html()) && !parseInt($('.sec').html()))        {            $('#btn').removeAttr('disabled');            $('#box').html(' <P style="font-size:.8em;line-height:2em;">秒杀开始!</P>');        }        $('#btn').click(function(){            var goods_id = $(this).attr('goods');            $.ajax({                type:"post",                url:"miaosha.php",                data:"goods_id="+goods_id,                dataType:'json',                success:function(msgs)                {              //   alert(msgs);                    if(msgs.code == 0)                    {                        alert(msgs.msg)                    }                    if(msgs.code == 1)                    {                        alert(msgs.msg)                    }                    if(msgs.code == 2)                    {                        alert(msgs.msg)                    }                }            })        })    })</script>

秒杀接值存入对列中,返回结果

  public function kill_du(Request $request)    {        //商品id        $goods_id = $request->get('goods_id');        $attr = $request->get('attr');       // print_r($attr);die;        $redis = new \redis();        $redis->connect('127.0.0.1',6379);                $kill_info = $redis->lRange('kill_goods'.$goods_id,0,-1);//        var_dump($kill_info);die;        //new一个session;        $session = new Session();        $user_info = $session->get('users');//        print_r($user_info);die;        if(empty($user_info) && !isset($user_info))        {            return json_encode(['code'=>3,'msg'=>"请先登录!"]);die;        }        if(isset($kill_info) )        {            //秒杀时间            $kill_time = $redis->get('kill_time'.$goods_id);            //开始时间            $start_time = strtotime(explode('_',$kill_time)[0]);            //结束时间            $end_time = strtotime(explode('_',$kill_time)[1]);            $time = time()+ 8 * 60 * 60;//            echo $start_time.'-'.$time.'-'.$end_time;            if($time> $start_time && $time < $end_time)            {                $num = $redis->get('kill_num'.$goods_id);                $size = $redis->lSize("kill_goods".$goods_id);//                echo $num.'-'.$size;                if($size-1 < $num)                {                    if(in_array($user_info['user_id'],$kill_info))                    {                        return json_encode(['code'=>5,'msg'=>"每个人只能秒杀一件商品!"]);                    }                    $redis->rpush('kill_goods'.$goods_id,$user_info['user_id'].'-'.$attr);                    return json_encode(['code'=>1,'msg'=>"秒杀成功,请在活动结束后查看订单!"]);                }                else                {                    return json_encode(['code'=>2,'msg'=>"商品已经售完!"]);                }            }            else            {                return json_encode(['code'=>4,'msg'=>"不在活动时间!"]);            }        }        else        {            return json_encode(['code'=>0,'msg'=>"该商品没有加入秒杀活动!"]);        }    }

生成订单

 /**     * 生成唯一订单号     * @return string     */    public function actionBuild_order_no(){        return 'kill_'.date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);    }    /**     * 订单生成     * @return json     */    public function actionGetodrer()    {        //获取活动商品id订单        $goods_id = \Yii::$app->request->get('goods_id');        $act_id = \Yii::$app->request->get('act_id');        $redis = new \redis();        $res = $redis->connect('127.0.0.1',6379);        if(!$res)        {            return json_encode(['code'=>0,'msg'=>"服务器错误!"]);        }        $kill_info = $redis->lRange('kill_goods'.$goods_id,0,-1);        $kill_price = $redis->get("kill_price".$goods_id);;//        var_dump($kill_price);die;        $order_num =count($kill_info)-1;        $num = 0;        if(isset($kill_info) && !empty($kill_info))        {            foreach($kill_info as $k => $v)            {                if(!empty($v))                {                    $kill = explode('-',$v);                    $user_id = $kill[0];                    $goods_attr = $kill[1];                    \Yii::$app->db->createCommand()->insert('man_order_info',[                        'user_id'=>$user_id,                        'goods_attr'=>$goods_attr,                        'goods_amount'=>$kill_price,                        'add_time'=>time(),                        'goods_id'=>$goods_id,                        'order_sn'=>$this->actionBuild_order_no(),                    ])->execute();                    $num++;                }            }            $actObj = new Man_activity();            $act  = $actObj::find()->where(['act_id'=>$act_id])->one();            $act->order_do = "1";            $result = $act->save();            if($result)            {                $redis->delete('kill_goods'.$goods_id);                return json_encode(['code'=>1,'msgs'=>"应生成".$order_num."条订单,共生成".$num."条订单!"]);            }            else            {                return json_encode(['code'=>2,'msgs'=>"应生成".$order_num."条订单,共生成".$num."条订单!"]);            }        }        else        {            return json_encode(['code'=>0,'msgs'=>"无需生成订单!"]);        }    }


1 1
原创粉丝点击