使用redis进行频率限制 , 并且使用滑动窗口形式 , 可以防止临界点时的超频
代码在下面 ,请自行替换new Redis()对象
function check($queueName,$count,$timeWindow){
$currTime=time();
$redis = php-redis对象;//自行连接redis
$length=$redis->lLen($queueName);
if($length<$count){
$redis->lPush($queueName,$currTime);
$redis->expire($queueName,$timeWindow);
return true;
}
//队列满了,取出最早访问的时间
$earlyTime= $redis->lIndex($queueName,$length-1);
//说明最早期的时间还在时间窗口内,还没过期,所以不允许通过
if ($currTime-$earlyTime <= $timeWindow) {
return false;
} else {
//说明最早期的访问应该过期了,去掉最早期的
$redis->rPop($queueName);
$redis->lPush($queueName,$currTime);
$redis->expire($queueName,$timeWindow);
}
return true;
}
使用方式 , 比如说24小时一次 ,对手机号的限制
if(check("tel-{$telephone}:",1,24*3600)){
$json=array("code"=>400,"msg"=>"当前手机号频率限制");
exit(json_encode($json));
}