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']);
}
}
})
})
最后就成功啦!
浙公网安备 33010602011771号