Sliding Window Rate Limit Redis

Implement a sliding window rate limiter using Redis sorted sets for precise distributed throttling.

TypescriptResilience

Code

snippet
// 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};}