Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

四大常用限流算法原理详解:计数器固定窗口、计数器滑动窗口、漏桶、令牌桶算法 PDF 下载


分享到:
时间:2021-05-29 09:10来源:http://www.java1234.com 作者:转载  侵权举报
四大常用限流算法原理详解:计数器固定窗口、计数器滑动窗口、漏桶、令牌桶算法 PDF 下载
失效链接处理
四大常用限流算法原理详解:计数器固定窗口、计数器滑动窗口、漏桶、令牌桶算法 PDF 下载


本站整理下载:
提取码:ti0b 
 
 
相关截图:
 
主要内容:


四⼤常⽤限流算法原理详解:计数器固定窗⼝、计
数器滑动窗⼝、漏桶、令牌桶算法
限流是指在系统⾯临⾼并发、⼤流量请求的情况
下,限制新的流量对系统的访问,从⽽保证系统服
务的安全性。常⽤的限流算法有计数器固定窗⼝算
法、滑动窗⼝算法、漏⽃算法和令牌桶算法,下⾯
将对这⼏种算法进⾏分别介绍,并给出具体的实
现。
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));
 }
}
特点分

 

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐