laravel-redis秒殺
阿新 • • 發佈:2020-11-20
在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']); } } }) })
最後就成功啦!