[PHP] 基于redis实现滑动窗口式的短信发送接口限流
Posted 陶士涵的菜地
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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=array( 60=>1, 600=>5, 3600=>10 ); $r = checkLimits($ipRules,$_SERVER["REMOTE_ADDR"],$_GET[‘tel‘]); var_dump($r); $r = checkLimits($phoneRules,$_GET[‘tel‘],$_GET[‘tel‘]); var_dump($r); function checkLimits($rules,$key,$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, 0, $score - $ruleTime);//移除窗口以外的数据 $redis->zAdd($redisKey, $score, $member); $redis->expire($redisKey, $ruleTime); $redis->zRange($redisKey, 0, -1, true); $members = $redis->exec(); if (empty($members[3])) { break; } $nums=count($members[3]); var_dump($nums); if($nums>$rule){ return false; } } return true; }
以上是关于[PHP] 基于redis实现滑动窗口式的短信发送接口限流的主要内容,如果未能解决你的问题,请参考以下文章