限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。限流会导致部分用户请求处理不及时或者被拒,这就影响了用户体验。所以一般需要在系统稳定和用户体验之间平衡一下。
常见的限流算法有四种,分别是:
- 固定窗口限流算法
- 滑动窗口限流算法
- 漏桶算法
- 令牌桶算法
这里就不挨个展开讲了,感兴趣可以看看这篇文章
使用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;
public void doRateLimit(String key) { RRateLimiter rateLimiter = redissonClient.getRateLimiter(key); rateLimiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS);
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次

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