访问太多服务器压力大怎么办?使用Redisson实现限流

898 词

限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。限流会导致部分用户请求处理不及时或者被拒,这就影响了用户体验。所以一般需要在系统稳定和用户体验之间平衡一下。

常见的限流算法有四种,分别是:

  • 固定窗口限流算法
  • 滑动窗口限流算法
  • 漏桶算法
  • 令牌桶算法

这里就不挨个展开讲了,感兴趣可以看看这篇文章

使用Redisson实现令牌桶算法来完成限流

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class RedissonLimiterManager {

@Resource
private RedissonClient redissonClient;

/**
* 限流操作
* @param key 区分不同的限流器,比如用户id
*/
public void doRateLimit(String key) {
RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
// 每个时间单位允许5次请求,每个时间单位有1s
rateLimiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS);

// 每当一个请求来了后,获取1个令牌
boolean canOp = rateLimiter.tryAcquire(1);
if (!canOp) throw new BusinessException(ErrorCode.TOO_MANY_REQUEST);
}
}

测试一下

测试代码如下:

1
2
3
4
5
6
7
8
@Test
void doRateLimit() {
String key = "1";
for (int i = 0; i < 5; i++) {
redissonLimiterManager.doRateLimit(key);
System.out.println("Success");
}
}

每秒5次请求,没有被限流

改成6次

可以看到,抛出了异常,限流的目的实现了