滑动窗口 Lua
滑动窗口 Lua
-- KEYS[1]=限流键; ARGV: now_ms, window_ms, limit, 唯一请求ID
local now = tonumber(ARGV[1])
redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, now - tonumber(ARGV[2]))
if redis.call('ZCARD', KEYS[1]) >= tonumber(ARGV[3]) then return 0 end
redis.call('ZADD', KEYS[1], now, ARGV[4])
redis.call('PEXPIRE', KEYS[1], ARGV[2])
return 1| 滑动窗口 | ZSet 成员=请求(近似精确),内存随请求量增长 |
|---|---|
| 令牌桶 | Hash(tokens,ts) + 速率参数,允许突发 |
| 调用 | EVAL 脚本 1 键 now window limit 请求ID |
| 唯一ID | 请求ID 保证同毫秒多请求不覆盖(如 uuid) |
高 QPS 下 ZSet 窗口每个请求一个成员,内存开销大;大流量常用「固定窗口+令牌桶」组合或网关侧限流。