美文网首页
限流算法-Java

限流算法-Java

作者: zianL | 来源:发表于2022-12-29 17:06 被阅读0次

单机版滑动窗口

package com.trade.common;


import java.util.LinkedList;


public class SlideWindow {

    /**
     * 定义窗口 链表
     */
    private LinkedList<Long> linkedList;

    /**
     * 单位窗口限流次数
     */
    private Integer count;
    /**
     * 窗口时间 单位毫秒
     */
    private Long timeWindow;

    public SlideWindow(Integer count, Long timeWindow) {
        this.count = count;
        this.timeWindow = timeWindow;
        linkedList = new LinkedList<>();
    }


    public synchronized boolean tryAcquire() {
        // 获取到当前系统时间
        long currentTimeMillis = System.currentTimeMillis();
        if (linkedList.size() < count) {
            // 最新的 node 节点存放 在最前面
            linkedList.add(0, currentTimeMillis);
            System.out.println(Thread.currentThread().getName() + "true," + currentTimeMillis);
            return true;// 放行
        }
        // 判断是否在窗口个数范围内
        int farIndex = count - 1;
        // 取出尾结点
        Long farTime = linkedList.get(farIndex);
        if (currentTimeMillis - farTime < timeWindow) {
            System.out.println(Thread.currentThread().getName() + "false," + currentTimeMillis);
            return false;
        }
        //已经超过窗口时间范围内,删除尾结点
        linkedList.remove(farIndex);
        //追加节点到链表头,保持窗口节点数
        linkedList.add(0, currentTimeMillis);
        System.out.println(Thread.currentThread().getName() + "true," + currentTimeMillis);
        return true;
    }

    public static void main(String[] args) throws InterruptedException {
        SlideWindow SlideWindow = new SlideWindow(2, 1000l);
        for (int i = 1; i <= 100; i++) {
            new Thread(() -> {
                boolean result = SlideWindow.tryAcquire();
            }).start();
            Thread.sleep(10);
        }
        Thread.sleep(10000);
    }

}

相关文章

  • 限流降级方案

    限流算法 并发数限流 计数器并发数限流:使用共享变量实现 信号量:使用java中的Semaphore QPS限流 ...

  • 限流框架系列之常见限流算法

    四种常见的限流算法 固定时间窗口限流算法 滑动时间窗口限流算法 令牌桶限流算法 漏桶限流算法 算法比较 算法确定参...

  • java限流算法

    1 场景 程序中经常需要对接口进行限流,防止访问量太大,导致程序崩溃。 常用的算法有:计数算法、漏桶算法、令牌桶算...

  • 高并发下的Nginx实用配置 - 限流和黑白名单

    1. 限流算法 漏桶算法 令牌桶算法 更多限流算法相关知识,请查看【单机限流 - 限流算法及隔离策略】[https...

  • 网关限流实例

    描述 限流是指将处理请求数限定在单位时间的阀值内。常用的限流算法固定时间窗口限流算法和滑动时间窗口限流算法。固定时...

  • 高并发环境下的限流策略

    本文将从以下几个方面分析限流策略: 什么是限流限流算法限流算法的应用 什么是限流 在开发高并发系统时,有很多手段来...

  • 基础架构 | 限流算法

    限流算法 令牌桶算法 漏桶算法

  • 2020-06-09

    目录 代理层限流 容器限流 API 限流 时间窗口 漏桶算法 令牌桶算法 总结 为了保护暴露在公网...

  • Redis+Lua脚本三步实现分布式系统限流

      在分布式系统中,说到限流方案我们一般会使用redis结合限流算法来做,一般的限流算法有令牌桶算法、漏桶算法、固...

  • 分布式架构

    大流量限流/削峰 常见的限流算法 计数器算法池化资源技术的限流就是通过计数器算法来控制全局的总并发数。 令牌桶算法...

网友评论

      本文标题:限流算法-Java

      本文链接:https://www.haomeiwen.com/subject/ddvtcdtx.html