欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

API 网关限流实战:令牌桶与滑动窗口算法选型

发表于:|最后更新:|分类:网络架构与安全|阅读:1738 次

限流是保护后端服务免受突发流量与恶意刷接口的核心手段。**令牌桶(Token Bucket)**允许一定程度的突发流量,适合面向用户的 API;**滑动窗口(Sliding Window)**统计更精确,适合严格配额场景。

一、Redis + Lua 实现分布式滑动窗口限流

lua
-- KEYS[1] = 限流键, ARGV[1] = 窗口毫秒数, ARGV[2] = 最大请求数
local key    = KEYS[1]
local window = tonumber(ARGV[1])
local limit  = tonumber(ARGV[2])
local now    = tonumber(redis.call('TIME')[1]) * 1000

redis.call('ZREMRANGEBYSCORE', key, 0, now - window)
local count = redis.call('ZCARD', key)
if count >= limit then
    return 0
end
redis.call('ZADD', key, now, now .. math.random())
redis.call('PEXPIRE', key, window)
return 1