限流是保护后端服务免受突发流量与恶意刷接口的核心手段。**令牌桶(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