1. 程式人生 > 實用技巧 >laravel-redis秒殺

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']);
                    }
                }
            })
        })

最後就成功啦!