• [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;
    }
  • 相关阅读:
    【转】灰色在PPT中的运用
    [转]多多“亦”善:把大量内容放到一页PPT的5个技巧
    android应用程序的安装方式与原理
    oracle 数据库 date + 1 转载
    运行ant脚本(转载)
    Oracle修改字段类型方法总结(转)
    转载 jQueryEasyUI Messager基本使用
    oracle dmp数据导入
    oracle 查看表的索引信息
    sqlplus 分析执行计划
  • 原文地址:https://www.cnblogs.com/taoshihan/p/13183619.html
Copyright © 2020-2023  润新知