基于 Redis+Lua 的分布式限流方案实战:从原理到落地

110 阅读1分钟

在微服务架构中,分布式限流是保障系统稳定性的核心手段。传统单机限流方案(如 Guava RateLimiter)无法跨节点协同,而 Redis+Lua 凭借原子性执行与高性能特性,成为分布式场景的最优解之一。

核心原理

  1. 利用 Redis 的 String/Hash 结构存储限流计数器,记录单位时间内请求次数;
  2. 通过 Lua 脚本封装 "判断 - 计数 - 返回" 逻辑,确保跨命令原子性,避免并发漏洞;
  3. 基于滑动窗口算法,动态调整时间窗口内的请求阈值,平衡灵活性与准确性。

实战实现

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 网关等场景落地,有效抵御流量峰值冲击,保障系统平稳运行。