laravel中实现redis秒杀

在laravel中 使用redis秒杀

首先我分为三步走 秒杀前,秒杀页,秒杀后操作。

我这边做了一个潦草的reids秒杀逻辑。

一、首先我准备好 数据库的创建seckill表(name,pic,price,stock,time_begin,time_over,created_at,updated_at,deleted_at)。这几个字段

接着准备好秒杀页面,从数据库中调出来数据渲染试图层。

 

二、redis 肯定是要有一个倒计时时间。

//秒杀倒计时
    public function countdown(){
        //sql查询
        $sqlQuery = "select * from lw_seckill";
        //执行查询
        $result = \DB::select(\DB::raw($sqlQuery));
        //转换json
        $data = json_decode(json_encode($result),true);
        //遍历数据
        foreach ($data as $k => $v){  
            //当前时间
            $startTime = time();
            //结束时间
            $endTime = $v['lw_time_over'];
            //结束时间 减去 当前时间
            $remainTime = $endTime-$startTime;
            //开始时间和结束时间之间的相差的描述
            $hour = floor($remainTime/3600);
            //1小时是3600秒,所有的秒数除以3600秒,是不就转换成小时了
            $minute = floor(($remainTime-$hour*3600)/60);
            //得出总时间差
            $second = $remainTime-$hour*3600-$minute*60;
            $data[$k]['hour'] = $hour;
            $data[$k]['minute'] = $minute;
            $data[$k]['second'] = $second;
        }
        return $data;
    }

试图效果

@foreach($data as $v)
            <div class="demo-miaosha">
                <h4 style="text-align: center;padding-top: 10px;font-family:'华文中宋' "><span style="color: red">秒杀倒计时</span>
                    <span id="h{{$v->id}}"></span><span id="m{{$v->id}}"></span><span id="s{{$v->id}}"></span></h4>
                <div class="demo-img"><img src="{{$v->lw_pic}}" alt="" width="200" height="250"></div>
                <p style="text-align: center;padding-top: 10px"><b>商品名称:</b>{{$v->lw_name}}</p>
                <p style="text-align: center"><b>商品价格:</b>{{$v->lw_price}}</p>
                <p style="text-align: center"><button class="btn btn-danger btn-w-xl btn-primary" type="button" id="{{$v->id}}">抢购</button></p>
            </div>
        @endforeach

<script type="text/javascript">
        $(document).ready(function (){
            //计时器
            window.setInterval(function (){
                $.ajax({
                    url: 'url域名',
                    type:'get',
                    dataType:'json',
                    success:function (data){
                        for (var i=0;i<data.length;i++){
                            id=data[i]['id'];
                            $('#h'+id).text(data[i]['hour']);
                            $('#m'+id).text(data[i]['minute']);
                            $('#s'+id).text(data[i]['second']);
                        }
                    }
                })
            },1000)
        })
    </script> 

效果图

三、秒杀前的准备

public function before(Request $request,SeckillModel $seckillModel){
        //数据库操作
        $sqlQuery = "select id,stock from seckill";
        //执行数据库
        $result = \DB::select(\DB::raw($sqlQuery));
        //转换json
        $data = json_decode(json_encode($result),true);
        //redis连接
        Redis::select(3);      //指定redis库
        foreach ($data as $k => $v){  
            for ($i=1;$i<$v['stock'];$i++){
                //从左边插入数据 一个一个插
                Redis::lpush('seckill'.$v['id'],$i);
            }
        }
        dump($data);
    }

四、就剩最后一步了秒杀后 ,这便是表单提交过来处理数据

// 秒杀后
    public function behind(Request $request){
        $id = $request->get("id");
        Redis::select(3);
        $key = 'seckill'.$id;
        if (Redis::llen($key)>0){
            Redis::lpop($key);
            $sql = \DB::update("update seckill set stock=stock-1 where id=$id");
            $order_id = date("Ymd",time()).md5(rand(100,999));
            $addtime = time();
            return ['code'=>1,'msg'=>'秒杀成功'];
        }else{
            return ['code'=>0,'id'=>$id,'msg'=>'此商品已秒杀结束'];
        }
    }

最后在视图加入jquery提交

$(".btn").click(function (){
            var id=$(this).attr('id');
            $.ajax({
                url: '提交的url',
                type:'get',
                dataType:'json',
                data:{'id':id},
                success:function (data){
                    if (data['code'] == 1){
                        alert(data['msg']);
                    }else{
                        alert(data['msg']);
                    }
                }
            })
        })

最后就成功啦!

posted on 2020-11-20 20:10  堇力  阅读(234)  评论(0)    收藏  举报

导航