基于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; }
♥ 作者:离岸少年
♠ 出处:https://www.cnblogs.com/jackzhuo/
♣ 本博客大多为学习笔记或读书笔记,本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理