使用 Lua 实现速率限制
在 Redis Lua 中以原子方式实现滑动窗口速率限制器。
使用 Lua 实现速率限制 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
为什么使用 Redis 进行限流?
Redis 提供原子操作、内存级速度,以及多个应用服务器之间共享的状态,因此非常适合分布式限流。
简单的固定窗口计数器
使用 INCR 和 EXPIRE 统计每个时间窗口内的请求数。
EVAL "
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local count = redis.call('INCR', key)
if count == 1 then
redis.call('EXPIRE', key, window)
end
if count > limit then
return 0 -- rejected
end
return 1 -- allowed
" 1 rate:user:123 100 60使用有序集合的滑动窗口
更准确的限流器会使用以时间戳为键值的有序集合。移除旧条目,添加当前请求,然后统计集合大小。
EVAL "
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 * 1000)
redis.call('ZADD', key, now, now .. math.random())
redis.call('EXPIRE', key, window)
local count = redis.call('ZCARD', key)
if count > limit then return 0 end
return 1
" 1 slidingRate:user:123 1706000000000 60 100令牌桶算法
令牌桶允许突发流量,同时保持平均速率。随着时间推移补充令牌;每个请求消耗一个令牌。
漏桶算法
漏桶会强制执行严格的恒定速率。请求会排队在桶中,并按照固定的排出速率进行处理。溢出的请求会被拒绝。
按用户和按 IP 限制
按用户 ID、API 密钥或 IP 地址为限流器设置键:rate:{userId}、rate:{ip}、rate:{apiKey}。
分级限流
根据用户层级(免费版与专业版)应用不同的限制。先检查用户层级,再选择要执行的限制。
EVAL "
local tier = redis.call('HGET', 'user:tier', ARGV[1])
local limit = tier == 'pro' and 10000 or 1000
-- ... rest of rate limit check
" 0 "userId123"返回标头
从脚本中返回剩余请求数和重置时间,以便应用程序在 HTTP 响应中设置 X-RateLimit 标头。
return {allowed, limit - count, resetTime}分布式原子性保证
由于整个限流检查都在单个 EVAL 脚本中完成,因此共享 Redis 集群的所有应用服务器实例都能获得原子性保证。
Redis 集群注意事项
在 Redis 集群模式下,脚本使用的所有 KEYS 都必须哈希到同一个槽位。请使用哈希标签:rate:{user123}:requests,以强制将它们放置在同一位置。
监控限流
记录被拒绝请求的用户/IP 信息。当拒绝率突然升高时设置告警(这表示可能存在攻击或配置错误)。
限流问题
为什么 Redis Lua 脚本比应用程序端的计数器更适合限流?
回顾:使用 Lua 进行限流
使用 Redis Lua 通过 INCR+EXPIRE(固定窗口)或有序集合(滑动窗口)实现限流器。原子脚本可以保证分布式应用服务器之间的正确性。返回剩余配额,以便设置 HTTP 标头。
常见问题解答
「使用 Lua 实现速率限制」课时是免费的吗?
是的 — 「使用 Lua 实现速率限制」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「使用 Lua 实现速率限制」这节课中我会学到什么?
在 Redis Lua 中以原子方式实现滑动窗口速率限制器。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 Lua 实现速率限制」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- EVAL 和 Redis Lua 环境
- 原子操作和事务
- 使用 Lua 实现速率限制
- SCRIPT LOAD 和 EVALSHA