| 结构 | key 为限流对象,score 为毫秒时间戳 |
|---|---|
| 窗口 | 如 60 秒内允许 100 次 |
| 原子 | Lua 内 ZREMRANGEBYSCORE 加 ZCARD 加 ZADD 加 PEXPIRE |
Lua 脚本示意
Lua 脚本示意
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, now - window)
local count = redis.call('ZCARD', KEYS[1])
if count < limit then
redis.call('ZADD', KEYS[1], now, now .. '-' .. math.random(1000000))
redis.call('PEXPIRE', KEYS[1], window)
return 1
end
return 0成员要带随机后缀去重:同一毫秒内多个请求的时间戳相同会被 ZSet 覆盖成一条。