答题抢红包tp6 + redis队列使用+生成区间数量的值


// 每日初始化
    
    public function defos(){
        $one= Db::name("prize_rules")->where("times","08:00:00")->find();
        $two= Db::name("prize_rules")->where("times","15:00:00")->find();
        $three= Db::name("prize_rules")->where("times","08:00:00")->find();
        //删除缓存中剩余的数据
        Cache::store('redis')->flushdb();
        // 第一个参数是从数据库读取的数据 第二个定义好的总数, 第三个最小值,第四个最大值
        $onenum =  $this->num($one["price"],700,0.3,0.5);
        //第一个活动 存入队列
        for($o=0;$o){
            Cache::store('redis')->lpush('one',$onenum[$o]);
        }
        
        
        $twonum =  $this->num($two["price"],600,0.3,0.5);
        //第二个活动 存入队列
        for($q=0;$q){
            Cache::store('redis')->lpush('two',$twonum[$q]);
        }
        $threenum =  $this->num($three["price"],700,0.3,0.5);
        //第三个活动 存入队列
        for($b=0;$b){
            Cache::store('redis')->lpush('three',$threenum[$b]);
        }
        return json(["msg"=>"各个时间段添加成功"]);
    }
    // 获取随机值
    public function num($money,$num,$min,$max) {//随机数值
    // 声明一个数组
        $data = array();
        if($min * $num >$money&&$max * $num <$money ){
            return array();
        }
        while($num >= 1){
        //  进入方法数量开始减一
        $num--;
        //  最小值 和 金额减去的数量乘以 最大数不够减那就取最小值
        $kmix = max($min,$money - $num * $max);
        //  同理
        $kmax = min($max,$money - $num * $min);
        //  求一个平均值 剩余的金额除以当次循环的剩余数量 
        $kAvg = $money / ($num + 1);
        //获取最大最小中间最小值 用平均值去减去这个值 得到一个小数点后两位 精度小数
        $kDis = min($kAvg - $kmix,$kmax - $kAvg);
        
        //  随机生成一个需要添加到 平均值上面的随机数 
        $r = ((float)(rand(1,10000) / 10000) - 0.5) * $kDis * 2;
        
        $k = round($kAvg + $r, 2);
       
        //  将金额减去本次计算出来的金额
        $money -= $k;
        //  存到数组里面
        $data[] = $k;
        }
        return $data;
    }
    

上方代码 基本都有注释 也是为了以后给我自己一个思路

 取值

public function money(){
        // 用户ID
        $uid = trim(input("uid"));
        $res =Db::name("prize_subinfo")->where("uid",$uid)->order("id desc")->find();
            if($res["sures"]>7){
                // 获取到今天获取到当天8点的时间
                $one= Db::name("prize_rules")->where("times","08:00:00")->find();
                $two= Db::name("prize_rules")->where("times","15:00:00")->find();
                $three= Db::name("prize_rules")->where("times","18:00:00")->find();
                $onetime =strtotime(date("Y-m-d ".$one["times"]),time());
                $twotime =strtotime(date("Y-m-d ".$two["times"]),time());
                $thetime =strtotime(date("Y-m-d ".$three["times"]),time());
                $endtime =strtotime(date("Y-m-d 10:00:00"),time());
                if($res["create_time"]>=$onetime &&$res["create_time"]<= $twotime){
                   // 第一个时间段
                   $info="one";
                }else if($res["create_time"]>=$twotime &&$res["create_time"]<= $thetime){
                   // 第二个时间段
                   $info="two";
                }else if($res["create_time"]>=$thetime && $res["create_time"]<=$endtime){
                   // 第三个时间段
                   $info="three";
                }else{
                    return json(["code"=>"0","msg"=>"当前不在抽奖的时间段","time"=>time(),"data"=>$res["create_time"]]);
                } 
                //获取队列长度
                $arr = Cache::store('redis')->lLen($info);
               // 如果队列中还存在 数据的话就进入循环
                if($arr>=1){
                    
                    $price =  Cache::store('redis')->lPop($info);
                    // 删除当前这个下标的的数组数据
                    $usera=array(
                        "uid"=>$uid,
                        "price"=>$price,
                        "subinfo"=>$res["id"],
                        "create_time"=>time()
                    );
                    $ads=Db::name("prize_record")->insert($usera);
                    if($ads){
                        return json(["code"=>"1","msg"=>"中奖啦:".$price.""]);
                    }else{
                        return json(["code"=>"0","msg"=>"插入数据库失败","data"=>$price]);
                    }
                     
                }else{
                    return json(["code"=>"0","msg"=>"奖池金额已经发放完毕"]);
                }
            }else{
                return json(["code"=>"0","msg"=>"不可抽奖","data"=>$res]);
            }
    }