[PHP] 基于redis实现滑动窗口式的短信发送接口限流

前端之家收集整理的这篇文章主要介绍了[PHP] 基于redis实现滑动窗口式的短信发送接口限流前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

滑动窗口短信发送限流算法

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;
        }
    }
    ;
}

 

猜你在找的PHP相关文章