滑动窗口短信发送限流算法
1.有两条规则
基于IP的限制和基于手机号的限制
IP规则:
1分钟限制5
10分钟限制30
1小时限制50
手机号规则:
1分钟限制1
10分钟限制5
1小时限制10
2.滑动窗口就是随着时间的流动,进行动态的删减区间内的数据,限制时获取区间内的数据
最主要的是用到了redis的zRemRangeByscore 来进行删除区间外的数据
<?PHP /*滑动窗口短信发送限流算法 1.有两条规则 基于IP的限制和基于手机号的限制 IP规则: 1分钟限制5 10分钟限制30 1小时限制50 手机号规则: 1分钟限制1 10分钟限制5 1小时限制10 */ //IP规则 $ipRules=array( 60=>5,600=>30,3600=>50 ); 手机号规则 $phoneRules=( 60=>1,600=>5,3600=>10 ); $r = checkLimits($ipRules,$_SERVER["REMOTE_ADDR"],1)">$_GET['tel']); var_dump($r); $phoneRules,1)">$_GET['tel'],1)">); function checkLimits($rules,1)">$key,1)">$tel){ $redis = new Redis(); $redis->connect('115.159.28.111',1991); foreach($rules as $ruleTime=>$rule) { $redisKey=$key."_".$ruleTime; $score=time(); $member=$tel.'_'.$score$redis->multi(); $redis->zRemRangeByscore($redisKey,1)">$score - $ruleTime);移除窗口以外的数据 $redis->zAdd($score,1)">$member); $redis->expire($redis->zRange(true$members = exec(); if (empty($members[3])) { break; } $nums=count(]); $nums); if($nums>){ return false; } } ; }