xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-starter-redis/src/main/resources/META-INF/scripts/blade_rate_limiter.lua
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
-- lua ä¸‹æ ‡ä»Ž 1 å¼€å§‹
-- é™æµ key
local key = KEYS[1]
-- é™æµå¤§å°
local max = tonumber(ARGV[1])
-- è¶…æ—¶æ—¶é—´
local ttl = tonumber(ARGV[2])
-- è€ƒè™‘主从策略和脚本回放机制,这个time由客户端获取传入
local now = tonumber(ARGV[3])
-- å·²ç»è¿‡æœŸçš„æ—¶é—´ç‚¹
local expired = now - (ttl * 1000)
-- æ¸…除过期的数据,移除指定分数(score)区间内的所有成员
redis.call('zremrangebyscore', key, 0, expired)
-- èŽ·å–å½“å‰æµé‡å¤§å°
local currentLimit = tonumber(redis.call('zcard', key))
local nextLimit = currentLimit + 1
if nextLimit > max then
    -- è¾¾åˆ°é™æµå¤§å° è¿”回 0
    return 0;
else
    -- æ²¡æœ‰è¾¾åˆ°é˜ˆå€¼ value + 1
    redis.call("zadd", key, now, now)
    -- ç§’为单位设置 key çš„生存时间
    redis.call("pexpire", key, ttl)
    return nextLimit
end