Redis 滑动窗口限流与统计Lua 脚本local key = KEYS[1] local now = tonumber(ARGV[1]) local window = tonumber(ARGV[2]) local limit = tonumber(ARGV[3]) redis.call('ZREMRANGEBYSCORE', key, 0, now - window) redis.call('ZADD', key, now, tostring(now)) local count = redis.call('ZCARD', key) redis.call('EXPIRE', key, math.ceil(window/1000)+1) return count <= limit 调用示例import Redis from 'ioredis' const r = new Redis() const lua = `redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, tonumber(ARGV[1]) - tonumber(ARGV[2])); redis.call('ZADD', KEYS[1], tonumber(ARGV[1]), ARGV[1]); local c = redis.call('ZCARD', KEYS[1]); redis.call('EXPIRE', KEYS[1], math.ceil(tonumber(ARGV[2])/1000)+1); return c <= tonumber(ARGV[3]);` const ok = await r.eval(lua, 1, 'rate:user:123', Date.now(), 60000, 120) 总结滑动窗口限流适合平滑控制请求速率,并可同时用于统计分析。

发表评论 取消回复