Skip to content

redis-lua限流脚本

约 416 字大约 1 分钟

计算机技术

2025-04-04

redis-lua 限流脚本

参考:https://gist.github.com/ptarjan/e38f45f2dfe601419ca3af937fff574d

令牌桶算法(token bucket)

并行限制 ZSET实现

并行限制可以控制同时并行的请求数,使用zset实现:

  1. 请求来到时,ZCARD查看count数,如果小于则ZADD添加,否则拒绝。
  2. 请求结束时,需要调用ZREM+id删除这个member
local key = KEYS[1]

local capacity = tonumber(ARGV[1]) -- 最大请求数
local timestamp = tonumber(ARGV[2]) -- 当前时间戳
local id = ARGV[3] -- 请求标识

local count = redis.call("ZCARD", key)
local allowed = count < capacity

if allowed then
  redis.call("ZADD", key, timestamp, id)
end

return { allowed, count }

定点刷新

还可以实现定点刷新脚本:假定每天凌晨四点刷新

利用redis过期机制刷新,先计算现在与下一个刷新点的时间差,检查key是否存在,如果不存在则SET

存在则DECRBY这个key,那么每天到点后,key过期就会自动刷新值。