示例说明
用 Redis 有序集合实现滑动窗口限速器,精确分布式节流。本示例属于弹性容错场景,提供可直接复制使用的typescript代码片段,附带边界条件与使用注意事项。
技术要点
- zremrangebyscore 清理窗口外旧记录
- zadd 添加当前请求时间戳
- zcard 统计窗口内请求数判断
代码解读
上述代码实现了Redis 滑动窗口限速的核心逻辑。用 Redis 有序集合实现滑动窗口限速器,精确分布式节流。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。zremrangebyscore 清理窗口外旧记录,zadd 添加当前请求时间戳。这些设计确保代码在生产环境中的健壮性。
使用建议
在实际项目中使用本示例时,建议先理解Redis 滑动窗口限速的适用场景与限制条件。zcard 统计窗口内请求数判断。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。
代码示例
// rate: sliding window rate limiter
import Redis from'ioredis';export async function slidingWindowLimit(redis:Redis,key:string,{windowMs=60000,maxRequests=100}={}):Promise<{allowed:boolean;remaining:number;resetAt:number}>{const now=Date.now();const windowStart=now-windowMs;const pipeline=redis.pipeline();pipeline.zremrangebyscore(key,'-inf',String(windowStart));pipeline.zadd(key,String(now),String(now+Math.random()));pipeline.zcard(key);pipeline.pexpire(key,windowMs);const results=await pipeline.exec();const count=Number(results?.[2]?.[1]??0);const allowed=count<=maxRequests;return{allowed,remaining:Math.max(0,maxRequests-count),resetAt:now+windowMs};}