当前位置: 首页 > news >正文

限流算法java实现

参考教程:2小时吃透4种分布式限流算法

1.计数器限流


public class CounterLimiter {// 开始时间private static long startTime = System.currentTimeMillis();// 时间间隔,单位为msprivate long interval = 1000L;// 限制访问次数private int limitCount = 2;// 访问次数private int reqCount = 0;private synchronized boolean tryAcquire(){long nowTime = System.currentTimeMillis();if(nowTime < startTime + interval){if(reqCount + 1 > limitCount){System.out.println(Thread.currentThread().getName() + "被限流了");return true;}reqCount++;System.out.println(Thread.currentThread().getName() + "通过了");return false;}else {reqCount = 1;startTime = nowTime;System.out.println(Thread.currentThread().getName() + "通过了");return false;}}public static void main(String[] args) {CounterLimiter counterLimiter = new CounterLimiter();for (int i = 0; i < 10; i++) {new Thread(() ->{counterLimiter.tryAcquire();}).start();}}}

2.滑动时间窗口限流


import java.util.LinkedList;public class SlidingTimeWindowLimiter {// 请求数量private int reqCount;// 窗口集合private LinkedList<Integer> slots = new LinkedList<>();// 限制访问量private int limitNum = 2;// 窗口数量private int windowNum = 100;// 每个窗口的时间范围,单位msprivate long windowLength = 100L;public synchronized Boolean limit(){if(reqCount + 1 > limitNum){System.out.println(Thread.currentThread().getName() + ": 被拦截了");return true;}reqCount++;slots.set(slots.size() - 1, slots.peekLast() + 1);System.out.println(Thread.currentThread().getName() + ": 通过了");return false;}public SlidingTimeWindowLimiter(){slots.addLast(0);new Thread(() -> {while (true){try {Thread.sleep(windowLength);}catch (InterruptedException e){e.printStackTrace();}slots.addLast(0);if(slots.size() > windowNum){reqCount = reqCount - slots.peekLast();slots.removeLast();System.out.println("滑动格子:" + reqCount);}}}).start();}public static void main(String[] args) {SlidingTimeWindowLimiter slidingTimeWindowLimiter = new SlidingTimeWindowLimiter();for (int i = 0; i < 10; i++) {new Thread(() -> {slidingTimeWindowLimiter.limit();}).start();}}}

3.漏桶算法


public class LeakyBucketLimiter {// 初始时间private long timestamp = System.currentTimeMillis();// 漏桶容量private long capacity = 5;// 流出速率private long rate = 10;// 桶内有多少请求private long water = 0;public synchronized Boolean limit(){long now = System.currentTimeMillis();water = Math.max(0, water - (now - timestamp) / 1000 * rate);timestamp = now;if((water + 1) <= capacity){water++;System.out.println(Thread.currentThread().getName() + "通过了");return false;}else{System.out.println(Thread.currentThread().getName() + "被拦截了");return true;}}public static void main(String[] args) {LeakyBucketLimiter counterLimiter = new LeakyBucketLimiter();for (int i = 0; i < 10; i++) {new Thread(() ->{counterLimiter.limit();}).start();}}}

4.令牌桶算法


public class TokenBucketLimiter {// 初始时间private long timeStamp = System.currentTimeMillis();// 令牌桶容量private long capacity = 5;// 每秒生成令牌的数量private long rate  = 2;// 桶内的令牌数private long tokens = 0;public synchronized Boolean limit(){long now = System.currentTimeMillis();tokens = Math.min(capacity, tokens + (now - timeStamp) * rate);timeStamp = now;// 没有令牌了if(tokens < 1){System.out.println(Thread.currentThread().getName() + "被拦截了");return true;}else {tokens--;System.out.println(Thread.currentThread().getName() + "通过了");return false;}}public static void main(String[] args) {TokenBucketLimiter slidingTimeWindowLimiter = new TokenBucketLimiter();for (int i = 0; i < 10; i++) {new Thread(() -> {slidingTimeWindowLimiter.limit();}).start();}}
}

http://www.lqws.cn/news/210133.html

相关文章:

  • 数组名作为函数参数详解 —— 指针退化及遍历应用示例
  • 【E9批量执行SQL】
  • SQL 基础入门
  • 手机端抓包大麦网抢票协议:实现自动抢票与支付
  • 免费 SecureCRT8.3下载、安装、注册、使用与设置
  • 六、Sqoop 导出
  • 交互标牌——视觉货币(数字)转换器项目及源码
  • 在ubuntu等linux系统上申请https证书
  • 多模型协同:基于 SAM 分割 + YOLO 检测 + ResNet 分类的工业开关状态实时监控方案
  • 使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
  • Python入门手册:异常处理
  • 【数据分析】探索婴儿年龄变化对微生物群落(呼吸道病毒和细菌病原体)结构的影响
  • Spring Boot 3.3 + MyBatis 基础教程:从入门到实践
  • 创建一个纯直线组成的字体库
  • 抖去推--短视频矩阵系统源码开发
  • model.classifier 通常指模型的分类头 是什么,详细举例说明在什么部位,发挥什么作用
  • 第二十六章 流程控制: case分支
  • 论文阅读:Matting by Generation
  • 26N60-ASEMI工业电机控制专用26N60
  • Xilinx FPGA MIPI DSI TX Subsystem 仿真笔记
  • JAVA学习 DAY3 注释与编码规范讲解
  • SOC-ESP32S3部分:33-声学前端模型ESP-SR
  • WSL文件如何上传到GitHub
  • MS2691 全频段、多模导航、射频低噪声放大器芯片,应用于导航仪 双频测量仪
  • 力扣hot100---152.乘积最大子数组
  • Nature子刊:16S宏基因组+代谢组学联动,借助MicrobiomeGS2建模揭示IBD代谢治疗新靶点
  • 基于 GWAS 的群体遗传分析将 bZIP29 确定为玉米中的异种基因
  • 跳跃游戏 dp还是线段树优化
  • UOS无法安装deb软件包
  • 日志收集工具-Filebeat