失效链接处理 |
四大常用限流算法原理详解:计数器固定窗口、计数器滑动窗口、漏桶、令牌桶算法 PDF 下载
本站整理下载:
相关截图:
![]()
主要内容:
四⼤常⽤限流算法原理详解:计数器固定窗⼝、计
数器滑动窗⼝、漏桶、令牌桶算法
限流是指在系统⾯临⾼并发、⼤流量请求的情况
下,限制新的流量对系统的访问,从⽽保证系统服
务的安全性。常⽤的限流算法有计数器固定窗⼝算
法、滑动窗⼝算法、漏⽃算法和令牌桶算法,下⾯
将对这⼏种算法进⾏分别介绍,并给出具体的实
现。
1、计数器固定窗⼝算法
原理
将某⼀个时间段当做⼀个窗⼝,在这个窗⼝内存在
⼀个计数器记录这个窗⼝接收请求的次数,每接收
⼀次请求便让这个计数器的值加⼀,如果计数器的值
⼤于请求阈值的时候,即开始限流。当这个时间段
结束后,会初始化窗⼝的计数器数据,相当于重新
开了⼀个窗⼝重新监控请求次数。
代码实现及测试
package project.limiter;
import java.util.concurrent.atomic.AtomicInteger;
public class CounterLimiter {
private int windowSize; //窗⼝⼤⼩,毫秒为单位
private int limit;//窗⼝内限流⼤⼩
private AtomicInteger count;//当前窗⼝的计数器
private CounterLimiter(){}
public CounterLimiter(int windowSize,int limit){
this.limit = limit;
this.windowSize = windowSize;
count = new AtomicInteger(0);
//开启⼀个线程,达到窗⼝结束时清空count
new Thread(new Runnable() {
@Override
public void run() {
while(true){
count.set(0);
try {
Thread.sleep(windowSize);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
//请求到达后先调⽤本⽅法,若返回true,则请求
通过,否则限流
public boolean tryAcquire(){
int newCount = count.addAndGet(1);
if(newCount > limit){
return false;
}else{
return true;
}
}
//测试
public static void main(String[] args) throws
InterruptedException {
//每秒20个请求
CounterLimiter counterLimiter = new
CounterLimiter(1000,20);
int count = 0;
//模拟50次请求,看多少能通过
for(int i = 0;i < 50;i ++){
if(counterLimiter.tryAcquire()){
count ++;
}
}
System.out.println("第⼀拨50次请求中通过:"
+ count + ",限流:" + (50 - count));
//过⼀秒再请求
Thread.sleep(1000);
//模拟50次请求,看多少能通过
count = 0;
for(int i = 0;i < 50;i ++){
if(counterLimiter.tryAcquire()){
count ++;
}
}
System.out.println("第⼆拨50次请求中通过:"
+ count + ",限流:" + (50 - count));
}
}
特点分
|