答题抢红包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]); } }