Java 分布式限流实战:Redisson RateLimiter 原理与使用
在现代分布式系统架构中,服务的高可用性、稳定性和安全性至关重要。随着微服务架构的普及,外部请求的不可控性带来了潜在风险——突发流量、恶意刷接口、爬虫攻击等。为了保障系统不被压垮,限流(Rate Limiting) 成为了一项基础而关键的技术手段。
在单机环境下,我们可以使用内存中的限流器(如 Guava 的 RateLimiter)。但当应用部署在多个实例时,每个实例都有自己的限流器,总请求量可能远超预期上限。因此,必须将限流状态集中存储,所有实例共享同一限流配额。Redis 作为高性能、支持原子操作的内存数据库,成为理想选择。
本文将深入探讨 Redisson 提供的 RRateLimiter,它是 Redis 官方推荐的 Java 客户端之一,封装了基于 Redis 的高性能分布式限流能力。
什么是限流?为什么需要分布式限流?
限流的定义
限流是指在单位时间内,对某个资源(如 API 接口、数据库连接、消息队列等)的访问次数进行限制,超过阈值的请求将被拒绝、排队或延迟处理。其核心目标是保护系统稳定性、公平资源分配以及合规与安全。
常见的限流算法包括计数器、滑动窗口、漏桶和令牌桶。Redisson RateLimiter 基于的是'令牌桶'算法,并利用 Redis 的原子操作保证分布式一致性。
单机限流 vs 分布式限流
在单体应用中,可以使用 Guava 的 RateLimiter:
RateLimiter limiter = RateLimiter.create(10); // 每秒 10 个令牌
if (limiter.tryAcquire()) {
// 处理请求
}
但在多实例部署下,3 个实例各限流 10 QPS,实际可能达到 30 QPS,违背了限流初衷。此时需基于 Redis 实现分布式限流。
Redisson 简介
Redisson 是一个基于 Netty 的高性能 Redis Java 客户端,它不仅提供了对 Redis 数据结构的封装,还实现了许多分布式对象和服务,包括分布式锁、信号量、限流器等。
Redisson 的设计哲学是:让开发者像使用本地 Java 对象一样操作分布式资源。其限流器 RRateLimiter 正是这一理念的体现。
Redisson RateLimiter 核心原理
Redisson 的 RRateLimiter 实现了分布式令牌桶算法,核心思想如下:
- 令牌生成:按固定速率向桶中添加令牌。
- 令牌消耗:每次请求尝试获取一个或多个令牌。
- 阻塞/非阻塞:若令牌不足,可选择立即失败或等待。
- 状态共享:所有实例通过 Redis 共享桶的状态。
Redis 内部数据结构
Redisson 使用 Redis 的 Hash 结构 存储限流器的状态,键名为 your_limiter_name,包含以下字段:
rate: 令牌生成速率rateInterval: 速率间隔


