Redis 秒殺

添加秒殺入庫

  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'=>"無需生成訂單!"]);
        }

    }



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