zoukankan      html  css  js  c++  java
  • 基于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;
    }
  • 相关阅读:
    一条查询SQl是怎样执行的
    MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见
    了解一下IO控制器与控制方式
    进程的同步与互斥
    预防死锁,检测死锁,避免死锁,解除死锁....
    初识Git
    剑指offer-查找数组中重复的数字
    常见的几种进程调度算法
    操作系统-进程的状态以及转换
    中断、异常、系统调用
  • 原文地址:https://www.cnblogs.com/jackzhuo/p/13211712.html
Copyright © 2011-2022 走看看