4种分布式限流算法

1.计数限流算法实现

bash 复制代码
public class CounterLimiter {

    private Long timeStamp = System.currentTimeMillis();
    //请求次数
    private  int reqCount;
    //每秒限流的最大请求书
    private  int limitNum = 100;
    //时间间隔
    private  Long interval = 1000L;


    /***
     * @Description
     * @Param []
     * @Return java.lang.Boolean 返回true代表限流,false代表通过
     **/
    public synchronized Boolean limit(){
        Long now = System.currentTimeMillis();
        if(now < timeStamp + interval){
            if(reqCount + 1 > limitNum){
                return true;
            }
            reqCount++;
            return false;
        }else{
            timeStamp = now;
            reqCount = 1;
            return false;
        }
    }
}

2.滑动窗口限流算法实现

bash 复制代码
public class SlidingTimeWindowLimiter {

    //请求计数器
    private int reqCount;
    //使用LinkedList来记录滑动窗口的10个格子
    private LinkedList<Integer> slots = new LinkedList<>();
    //每秒限流的最大请求数
    private int limitNum = 100;
    //滑动窗口每个格子的时间长度,单位ms
    private long windowLength = 100;
    //滑动窗口的格子数量
    private int windowNum = 10;

    public synchronized Boolean limit(){
        if(reqCount + 1 > limitNum){
            return true;
        }
        slots.set(slots.size() - 1, slots.peekLast() + 1);
        reqCount++;
        return false;
    }

    public SlidingTimeWindowLimiter() {
        slots.add(0);
        new Thread(() -> {
            while (true) {
                try{
                    TimeUnit.MILLISECONDS.sleep(windowLength);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (this) {
                    //滑动窗口
                    slots.add(0);
                    if(slots.size() > windowNum){
                        reqCount -= slots.peekFirst();
                        slots.removeFirst();
                    }
                }
            }
        }).start();
    }
}

3.漏桶限流算法实现

bash 复制代码
public class LeakyBucketLimiter {

    private long timeStamp = System.currentTimeMillis();
    //桶的容量
    private long capacity = 100;
    //水漏的速度(每秒系统能处理的请求数)
    private long rate = 10;
    //当前水量(当前积累请求书)
    private long water = 0;

    public synchronized Boolean limit(){
        long now = System.currentTimeMillis();
        water = Math.max(0, (now - timeStamp)/1000 * rate);
        timeStamp = now;
        if(water + 1 <= capacity){
            water++;
            return false;
        }else {
            //水满,拒绝加水
            return true;
        }


    }
}

4.令牌桶限流算法实现

bash 复制代码
public class TokenBucketLimiter {
    private long timeStamp = System.currentTimeMillis();
    //桶的容量
    private long capacity = 100;
    //水漏的速度(每秒系统能处理的请求数)
    private long rate = 10;
    //当前水量(当前积累请求书)
    private long tokens = 100;


    public synchronized Boolean limit(){
        long now = System.currentTimeMillis();
        //先添加令牌
        tokens = Math.min(capacity, tokens + (now - timeStamp)/1000 * rate);
        timeStamp = now;
        if(tokens - 1 > 0){
            return true;
        }
        //领取令牌
        tokens --;
        return false;
    }
}
相关推荐
Amumu1213813 分钟前
Js:正则表达式(一)
开发语言·javascript·正则表达式
无人机9011 小时前
Delphi 网络编程实战:TIdTCPClient 与 TIdTCPServer 类深度解析
java·开发语言·前端
froginwe111 小时前
CSS 图像拼合技术
开发语言
计算机安禾1 小时前
【数据结构与算法】第22篇:线索二叉树(Threaded Binary Tree)
c语言·开发语言·数据结构·学习·算法·链表·visual studio code
:mnong2 小时前
Superpowers 项目设计分析
java·c语言·c++·python·c#·php·skills
我是唐青枫2 小时前
C#.NET 分布式事务 深入解析:TCC、Saga、Outbox 与落地取舍
分布式·c#·.net
a里啊里啊2 小时前
测试开发面试题
开发语言·chrome·python·xpath
豆沙糕2 小时前
Python异步编程从入门到实战:结合RAG流式回答全解析
开发语言·python·面试
信奥胡老师2 小时前
P1255 数楼梯
开发语言·数据结构·c++·学习·算法
A.A呐2 小时前
【C++第二十一章】set与map封装
开发语言·c++