在微服务架构中,分布式限流是保障系统稳定性的核心手段。传统单机限流方案(如 Guava RateLimiter)无法跨节点协同,而 Redis+Lua 凭借原子性执行与高性能特性,成为分布式场景的最优解之一。
核心原理
- 利用 Redis 的 String/Hash 结构存储限流计数器,记录单位时间内请求次数;
- 通过 Lua 脚本封装 "判断 - 计数 - 返回" 逻辑,确保跨命令原子性,避免并发漏洞;
- 基于滑动窗口算法,动态调整时间窗口内的请求阈值,平衡灵活性与准确性。
实战实现
1. Lua 限流脚本
lua
local key = KEYS[1] -- 限流key(如user:123:api)
local limit = tonumber(ARGV[1]) -- 限流阈值
local window = tonumber(ARGV[2]) -- 时间窗口(秒)
local current = redis.call('incr', key)
if current == 1 then
redis.call('expire', key, window) -- 首次设置过期时间
end
return current <= limit -- 返回是否允许请求
2. 服务端集成(Java 示例)
通过 Spring Data Redis 调用脚本,封装通用限流工具类,支持按用户、接口等多维度限流,结合 AOP 实现无侵入式接入。
优势与优化
- 高性能:Redis 单实例支持每秒 10 万 + 请求,Lua 脚本执行耗时毫秒级;
- 可扩展:配合 Redis Cluster 实现水平扩容,应对高并发场景;
- 避坑点:需合理设置窗口粒度,避免缓存穿透,建议搭配熔断降级机制使用。
该方案已在电商秒杀、API 网关等场景落地,有效抵御流量峰值冲击,保障系统平稳运行。