redis秒杀[我是大白,我是猿]

针对laravel框架
控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class MiaoController extends Controller
{
    //秒杀前的准备
//一个PHP脚本,将未来要秒杀的商品保存在我的redis服务器中
    public function before(){
        $arrs = DB::select("select id,stock from goods");
        $data = json_decode(json_encode($arrs),true);

        $redis=new \Redis();
        $redis->connect('127.0.0.1',6379);
        $redis->select(10);		// 不写此语句,默认是0号数据库
        // 循环(遍历)所有商品
        foreach ($data as $key => $value) {
            // 给每个商品在redis中创建一个对应的列表,这个列表的键名是 goods+id值
            for($i=1;$i<=$value['stock'];$i++){
                $redis->lpush('goods'.$value['id'],$i);		// 键是 goods1 goods2 goods3等
            }
        }

    }

    //秒杀中
    public function index(){
        $data = DB::select("select * from goods");
        return view("miao_index",['data'=>$data]);
    }
    //算出距离秒杀结束还有多少时分秒
    public function daojishi(){
        $arrs = DB::select("select * from goods");
        $data = json_decode(json_encode($arrs),true);
        // 计算倒计时
        foreach($data as $key=>$value){
            $startTime=time();
            $endTime=$value['endtime'];
            $remainTime=$endTime-$startTime;			// 开始时间和结束时间之间相差的秒数
            $hour=floor($remainTime/3600);		// 1小时是3600秒,所有的秒数除以3600秒,是不就转换成小时了
            $minute=floor(($remainTime-$hour*3600)/60);				// 分钟
            $second=$remainTime-$hour*3600-$minute*60;		// 秒
            $data[$key]['hour']=$hour;
            $data[$key]['minute']=$minute;
            $data[$key]['second']=$second;
        }
        return $data;
    }
    //秒杀后
    public function miao_hou(Request $request){
        $id = $request->get("id");
        $redis=new \Redis();
        $redis->connect('127.0.0.1',6379);
        $redis->select(10);		// 不写此语句,默认是0号数据库
        $key='goods'.$id;		// redis键名
        if($redis->llen($key)>0){
            $redis->lpop($key);		// 从队列中移除一个元素
            // 库存减1composer -vvv require alibabacloud/sdk
            //$sql=DB::update("update goods set stock=stock-1 where id=$id");
            // 向order表中添加记录————生成订单
            $order_id=date('Ymd',time()).md5(rand(100,999));		// 订单号,你可以随便生成
            $addtime=time();
            //$sql1=DB::insert("insert into order(order_id,goods_id,addtime) values('$order_id',$id,$addtime)");

            // 如果库存减1执行成功,则进一步向订单表中添加记录记录,同时向前台返回提示信息
            //if($sql){
            //if($sql1){// 向订单表中添加记录
            return ['code'=>1,'msg'=>'秒杀成功!'];		// 向前台返回数据
            //}
            //}
        }else{
            return ['code'=>0,'id'=>$id,'msg'=>'秒杀结束!'];
        }

    }

}

视图层


<html>
<head>
    <title></title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</head>
<body>
@foreach($data as $value)
    <div style='float:left;margin-right:20px;'>
        <p>
            <span id="h{{$value->id}}"></span><span id="m{{$value->id}}"></span><span id="s{{$value->id}}"></span></p>

        <p><img src="{{$value->path}}" width='280' height='200'></p>
        <p>{{$value->name}}</p>
        <p>{{$value->price}}</p>
        <p><input type='button' value='抢购' id="{{$value->id}}"></p>
        <p>库存:<?php
            $con =  new MySQLi("localhost","root","root","test");
            $sql = "select stock from goods";
            $result = $con->query($sql);
            $str = "";
            foreach($result as $k => $v){
                $str .=implode(',',$v) . '-';
            }
            $str =substr($str ,0, strlen($str) -1);
            echo $str;
            ?></p>
    </div>
@endforeach
</body>
</html>

<script>
    // 倒计时
    $(document).ready(function(){
        // 计时器
        window.setInterval(function(){
            $.ajax({
                url:'http://127.0.0.1:8001/daojishi',
                type:'get',
                dataType:'json',
                success:function(data){
                    for(var i=0;i<data.length;i++){
                        id=data[i]['id'];		// 商品ID
                        $('#h'+id).text(data[i]['hour']);
                        $('#m'+id).text(data[i]['minute']);
                        $('#s'+id).text(data[i]['second']);
                    }
                }
            });
        },1000);		// 每秒(1000毫米)执行一次代码

        // 抢购按钮加单击事件
        $("input[type=button]").click(function(){
            var id=$(this).attr('id');
            $.ajax({
                url:'http://127.0.0.1:8001/miaoshahou',
                type:'get',
                dataType:'json',
                data:{'id':id},
                success:function(data){
                    if(data['code']==1){
                        alert(data['msg']);
                    }else{
                        alert(data['msg']);
                    }
                }
            });
        });
    });

</script>



数据库

  $table->string('name');
  $table->string('price');
  $table->string('stock');
  $table->string('starttime');
  $table->string('endtime');
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值