限流算法整理——滑动窗口限流算法

限流算法描述

滑动窗口限流需要将每个窗口空间划分为无限小的窗口区间,并且动态调整区间的起始点,并且在调整完毕之后需要判断各个区间,累加各个区间的请求,查看是否到达最大的阈值,以此返回允许请求还是拒绝请求

算法实现

结构定义

首先需要定义结构,因为在滑动窗口中,起到限流作用的应该是最大请求数和当前的小时间窗口(单位: 时间/ 毫秒),一开始的窗口起点应该是最新的当前系统时间

 private long windowStart = System.currentTimeMillis();
//滑动窗口的单位(小)窗口长度private long windowSize;
//限流最大的请求数量private int maxRequest;
private Map<Long, LongAdder> windowCount = new ConcurrentHashMap<>();

限流分析

首先进入tryAcquire方法中需要判断最新的时间是否已经走过了窗口的右侧,如果是,更新窗口,并且清空窗口内的请求

 long currentTimeMillis = System.currentTimeMillis();long windowEnd = windowStart + windowSize;if (windowEnd < System.currentTimeMillis()) {//重新计数windowStart = System.currentTimeMillis();windowCount.clear();}

之后,进入到窗口中请求的计算,需要对更新过后的时间窗口区间进行request的统计,为了保证多线程情况下的并发安全问题,这里是哟inglongAdder作为计数器,并且对方法进行synchronized关键字修饰

		long windowId = currentTimeMillis - (currentTimeMillis % windowSize);LongAdder count = windowCount.computeIfAbsent(windowId, k -> new LongAdder());// 尝试增加计数count.increment();// 检查是否超过限制return count.longValue() <= maxRequest;

注意这部分的关键就是计算窗口标识的部分,我们用当前时间 - 当前时间对于时间窗口的取模,来判断属于哪个编号的窗口,举例说明:

-假设窗口大小是1000毫秒(即1秒),当前时间是12345ms。currentTimeMillis % windowSizeInMs 计算 12345 % 1000,结果是 45。 然后我们从这个当前时间中减去余数 12345 - 45,得到 12300,因此这个时间的请求属于 12300这个时间窗口

我们最终在mian函数中执行初始化和测试用例,给出限制请求大小为2,时间窗口为1s即1000ms,在for循环中模拟 10次请求

public static void main(String[] args) {SlidingWindowDemo rateLimiter = new SlidingWindowDemo(2, 1000); // 窗口容量为10,窗口大小为1秒// 模拟请求for (int i = 0; i < 10; i++) {// 模拟请求之间的时间间隔try {TimeUnit.MILLISECONDS.sleep(200); // 每个请求间隔200毫秒} catch (InterruptedException e) {e.printStackTrace();}// 尝试获取限流器boolean acquired = rateLimiter.tryAcquire();System.out.println("Request " + (i + 1) + ": " + (acquired ? "Acquired" : "Denied"));}}

最终运行结果

收到拒绝消息,说明限流算法成功
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库与数据库管理系统 MySQL的安装 SQL语言学习:DDL、DML

day51 数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。 通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据&#xff0c;如数据库管理系统MySQL 数据…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式&#xff0c;可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

时间序列差分顺序的讨论

生成出一组时间序列数据 服从标准正态分布的50个 随机数据 分别给出4步季节差分&#xff0c;再进行1步1阶差分的结果 和 1步1阶差分再进行 4步季节差分 的结果 讨论&#xff1a; 先进行4步季节差分再进行1步1阶差分与先进行1步1阶差分再进行4步季节差分的结果看起来是相同的

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶

潍柴雷沃智慧农业科技股份有限公司&#xff0c;是潍柴集团重要的战略业务单元&#xff0c;旗下收获机械、拖拉机等业务连续多年保持行业领先&#xff0c;是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后&#xff0c;…

kaggle:房价预测

比赛链接 结果展示 结果链接 8848是密码 文章目录 数据处理调包部分拒绝掉包岭回归理论代码实践结果 自助采样理论代码 集成学习前言Bagging理论Bagging-Ridge代码Bagging-Ridge实践Bagging-Ridge结果 Tricks 数据处理 #打开文件 import pandas as pd dataset1pd.read_csv(&q…

How to install a dataset from huggingface?

当我从抱抱脸上git clone imdb数据集时&#xff0c;plain_text里的文件是这样的&#xff1a;

梦想的味道,特别的邀约 —— 蒙自源六一儿童节特别活动

每个孩子心中都有一颗梦想的种子&#xff0c;只需一点阳光和雨露&#xff0c;便能生根发芽&#xff0c;开出绚烂的花朵。六一儿童节&#xff0c;是孩子们的节日&#xff0c;也是他们梦想起航的日子。蒙自源希望成为孩子们梦想的沃土&#xff0c;用美食和爱滋养他们的成长。在这…

【Qt知识】Qt框架中的信号(Signals)与槽(Slots)机制

Qt框架中的信号&#xff08;Signals&#xff09;与槽&#xff08;Slots&#xff09;机制是一种强大的通信方式&#xff0c;允许对象之间相互通信而无需对象之间直接引用或了解对方。这一机制简化了应用程序的事件处理和组件之间的交互&#xff0c;是Qt的一大特色和核心概念。 …

Qt6.4.2基于CMake添加Qt3DCore模块报错

在文档中说明是添加 find_package(Qt6 REQUIRED COMPONENTS 3dcore) target_link_libraries(mytarget PRIVATE Qt6::3dcore)find_package是没有问题&#xff0c;但是target_link_libraries会报错&#xff0c;报拼写错误&#xff0c;无法链接上Qt6::3dcore 需要使用“3DCore”…

windows系统搭建go开发编译环境

1、前言 windows系统&#xff0c;从零开始搭建go开发编译环境详细步骤。 2、go下载和安装 2.1 下载 下载地址如下&#xff1a; All releases - The Go Programming Language 可以根据自己的需要选择下载对应的版本下载即可。 对于windows系统&#xff0c;如果是6…

有开源软件,也有开源硬件?

开源软件或库有很多&#xff0c;例如 Linux 操作系统的内核 The Linux Kernel Archiveshttps://www.kernel.org/ 开源的各种Linux发行版本&#xff0c;Ubuntu 、CentOS等 Enterprise Open Source and Linux | Ubuntuhttps://ubuntu.com/ 开源的视觉函数库&#xff0c;OpenC…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:美团小袋自动配送车

大型电商公司美团已选用NVIDIA Jetson AGX Xavier 平台&#xff0c;作为无人配送机器人核心AI算力。 美团点评是全球大型的按需食品配送公司&#xff0c;结合了Uber Eats、Yelp和Groupon的商业模式&#xff0c;与超过40万家本地企业开展合作。他们推出了小袋自动配送车&#…

基于深度学习YOLOv8\YOLOv5的花卉识别鲜花识别检测分类系统设计

本文将介绍基于深度学习YOLOv8\YOLOv5PySide6SQLite的花卉检测与识别系统&#xff0c;该系统基于YOLOv8算法&#xff0c;并与YOLOv5版本进行比较&#xff0c;该系统不仅实现了对花卉的精准识别和分类&#xff0c;还提供了包括用户认证管理、模型快速切换及界面个性化定制在内的…

PCL点云格式转换成tiff格式

需要把PCL的点云格式转换成tiff格式的图片。 一、第一种转换函数 主要思路: 使用了libtiff库,来写tiff格式把点云的x,y,z通道转换成tiff格式图片的三通道。所以后续读取tiff格式图片转换成点云时,注意三通道代表x,y,z的顺序写tiff格式的时候就是设置文件头,然后把数据一个…

【如何在日志中输出精确到毫秒的时间戳】

1. 需求 在日志中输出精确到毫秒级的时间戳&#xff0c; 格式为&#xff1a;%Y-%m-%d %H:%M:%S.%MS 如&#xff1a;2024-05-30 22:33:25.821 2. 代码实现 #include <iostream> #include <chrono> #include <iomanip> #include <sstream> #include &…

手把手教你如何通过配置hosts文件实现屏蔽广告(去广告hosts文件)

📖 介绍 📖 如果你对广告烦不胜烦,并希望通过一种简单有效的方式去除广告,那么使用 hosts 文件来屏蔽广告是一个不错的选择。本文将详细介绍如何配置和使用 hosts 文件来屏蔽广告,从而提升你的浏览体验。 🏡 演示环境 🏡 本文演示环境如下 操作系统:Windows 11编辑…

HCIA-传输层协议

传输层的俩大协议TCP和UDP 对初学者的要求是对协议有所了解即可&#xff0c;它实现了哪些功能 未来的我这个网普通PC要去访问服务器并与之的数据进行交互 192.168.1.1 -访问-> 192.168.1.2(VX) 192.168.1.1 -访问-> 192.168.1.3(ZFB) 192.168.1.1 -访问-> 192.168.1.…

css特殊效果和页面布局

特殊效果 圆角边框&#xff1a;div{border-radius: 20px 10px 50px 30px;} 四个属性值按顺时针排列&#xff0c;左上的1/4圆半径为20px&#xff0c;右上10&#xff0c;右下50&#xff0c;左下30。 div{border-radius: 20px;} 四角都为20px。 div{border-radius: 20px 10…

Tomcat安装和配置(图文详解)_tomcat安装及配置教程

Tomcat是一个开源的Web应用服务器&#xff0c;它是Apache软件基金会的一个项目。Tomcat被广泛用作Java Servlet和JavaServer Pages&#xff08;JSP&#xff09;技术构建的Web应用程序的运行环境。 它是轻量级的&#xff0c;适合中小型系统和并发访问用户不是很多的场合&#x…

外界访问docker服务失败

各位i大佬请问一下&#xff1a;我容器起了&#xff0c;但是外网访问不了目标机器的9090端口。 我检查了&#xff1a;1.本机的防火墙已关闭&#xff0c; 2.目标机器的9090端口显示正在被docker监听。 3.外网可以访问目标机器。 4.docker日志&#xff0c;未显示服务报错。 5…