1.它是限流算法中最简单最容易的一种算法
计数器实现限流 每分钟只允许10个请求 第一个请求进去的时间为startTime,在startTime + 60s内只允许10个请求
当60s内超过十个请求后,拒绝,不超过,到第60s 重新设置时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 1package com.aiyuesheng.utils;
2
3import java.util.concurrent.atomic.AtomicInteger;
4import lombok.Getter;
5import lombok.Setter;
6
7/**
8 * @author chris
9 * @see 计数器实现限流 每分钟只允许10个请求 第一个请求进去的时间为startTime,在startTime + 60s内只允许10个请求
10 * 当60s内超过十个请求后,拒绝,不超过,到第60s 重新设置时间
11 */
12@Setter
13@Getter
14public class LimitService {
15 // 限流的个数
16 private int maxCount = 10;
17 // 指定的时间内
18 private long interval = 60;
19 // 原子类计数器
20 private AtomicInteger atomicInteger = new AtomicInteger(0);
21 // 起始时间
22 private long startTime = System.currentTimeMillis();
23
24 public boolean limit(int maxCount, int interval) {
25 atomicInteger.addAndGet(1);
26 if (atomicInteger.get() == 1) {
27 startTime = System.currentTimeMillis();
28 atomicInteger.addAndGet(1);
29 return true;
30 }
31 // 超过了间隔时间,直接重新开始计数
32 if (System.currentTimeMillis() - startTime > interval * 1000) {
33 startTime = System.currentTimeMillis();
34 atomicInteger.set(1);
35 return true;
36 }
37 // 还在间隔时间内,check有没有超过限流的个数
38 if (atomicInteger.get() > maxCount) {
39 return false;
40 }
41 return true;
42 }
43}
44
它是限流算法中最简单最容易的一种算法,比如我们要求某一个接口,1分钟内的请求不能超过10次,我们可以在开始时设置一个计数器,每次请求,该计数器+1;如果该计数器的值大于10并且与第一次请求的时间间隔在1分钟内,那么说明请求过多,如果该请求与第一次请求的时间间隔大于1分钟,并且该计数器的值还在限流范围内,那么重置该计数器