Redisson 的 RRateLimiter 属于 分布式限流框架 类别,它基于 Redis 实现分布式限流,可归类到前文提到的 "Redis + Lua脚本" 方案中,但 Redisson 对其进行了更高层次的封装。
核心解析
-
所属框架:
- 分布式限流:依赖 Redis 作为分布式协调中间件,适用于多实例共享限流配额场景。
- 算法 :基于 令牌桶算法(Token Bucket),支持平滑限流和突发流量控制。
-
实现原理:
- Redis 存储 :通过 Redis 的
HASH
结构存储令牌桶状态(如当前令牌数、上次填充时间等)。 - Lua 脚本:利用 Redis 的原子性 Lua 脚本操作,确保限流逻辑的原子性(如取令牌、更新令牌桶状态)。
- Redis 存储 :通过 Redis 的
-
特点:
- 分布式一致性:所有服务实例通过 Redis 共享限流状态,避免单机限流的配额不均问题。
- 高可用性:依赖 Redis 集群或哨兵模式保障可用性。
- 动态配置 :支持运行时调整速率(如
trySetRate
方法)。
使用示例
java
// 创建 Redisson 客户端
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
// 获取限流器
RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
// 初始化:每秒生成5个令牌,最大容量10个令牌
rateLimiter.trySetRate(RateType.OVERALL, 5, 10, RateIntervalUnit.SECONDS);
// 申请令牌
if (rateLimiter.tryAcquire(1)) { // 非阻塞尝试获取1个令牌
// 执行业务逻辑
} else {
// 触发限流处理
}
与其他方案的对比
方案 | 类型 | 优势 | 局限 |
---|---|---|---|
Redisson RRateLimiter | 分布式限流 | 开箱即用,API 友好;支持动态调整速率 | 依赖 Redis 稳定性;性能受 Redis 吞吐影响 |
Redis + Lua 脚本 | 分布式限流 | 灵活定制,轻量级 | 需自行实现逻辑和状态管理 |
Sentinel | 单机/分布式 | 功能全面(限流、熔断、降级);支持动态规则 | 分布式需配合 Nacos/ZK 等组件 |
Guava RateLimiter | 单机限流 | 零外部依赖,高性能 | 仅适用于单机 |
适用场景
- 微服务架构:多个服务实例需要共享全局速率限制(如 API 网关、分布式任务调度)。
- 高可用要求:通过 Redis 集群保障限流器的高可用性。
- 动态调整需求:业务高峰期需临时调整限流阈值(如秒杀活动)。
注意事项
- Redis 性能:确保 Redis 的吞吐量和延迟满足业务要求(建议使用 Redis 集群)。
- 网络开销:每次令牌申请需与 Redis 交互,高频场景可能成为瓶颈。
- 冷启动问题:服务重启后需重新初始化限流器状态(可通过持久化配置解决)。
总结:RRateLimiter 是 Redisson 提供的分布式限流组件,属于 Redis 生态中的高级封装方案,适合需在多实例间精确控制速率的场景。