【令牌桶算法与漏桶算法】

在这里插入图片描述

                                                                              💧 令牌桶算法与漏桶算法 \color{#FF1493}{令牌桶算法与漏桶算法} 令牌桶算法与漏桶算法💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🎐 《Redis》专栏的文章是在学习Redis时,整理的笔记与记录的思考~ 🥏
🥕 《RabbitMQ》专栏的文章是在学习尚硅谷课程时整理的笔记,方便复习巩固~ 🍑
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • 🐳令牌桶算法与漏桶算法
    • 🌊令牌桶算法(Token Bucket Algorithm)
      • 🌊代码实现(Java)
    • 🌊漏桶算法(Leaky Bucket Algorithm)
      • 🌊代码实现(Java)
    • 🌊总结
  • 🐳结语


🐳令牌桶算法与漏桶算法

令牌桶算法和漏桶算法都是用于限制请求速率的流量控制算法,通常用于网络、服务器和API等场景中,以防止突发的流量超出系统的处理能力。它们的主要区别在于如何处理流量超出限制的情况以及在限制流量时的行为。


🌊令牌桶算法(Token Bucket Algorithm)

💧令牌桶算法的核心思想是,系统维护一个固定容量的令牌桶,这个桶以恒定的速率往里面添加令牌,每个令牌代表一个请求的许可。当一个请求到达时,它需要从令牌桶中获取一个令牌,只有当令牌桶中有足够的令牌时,请求才会被允许通过,否则请求会被拒绝或等待。

💧令牌桶算法的关键参数包括:

  • 桶容量(Bucket Capacity):表示令牌桶可以存储的最大令牌数量。
  • 令牌生成速率(Token Generation Rate):表示每秒钟系统向令牌桶中添加的令牌数量。

💧算法的基本工作流程如下:

  1. 令牌桶初始化时,设定桶容量和令牌生成速率。
  2. 每隔一定时间(例如每秒),往桶中添加一个令牌,但不会超过桶的容量。
  3. 当请求到达时,如果令牌桶中有足够的令牌,就允许请求通过,并从令牌桶中消耗一个令牌;否则,请求被限制或等待,直到有足够的令牌。

💧令牌桶算法的优点是可以处理瞬时的流量峰值,如果桶中有足够的令牌,请求才可以被立即处理。同时,令牌桶算法也可以平滑地控制请求速率。

🌊代码实现(Java)

import java.util.concurrent.Semaphore;class TokenBucket {private final int capacity; // 令牌桶容量private final long generationInterval; // 令牌生成间隔时间(毫秒)private long lastGenerationTime; // 上次生成令牌的时间private int tokens; // 当前令牌数量private final Semaphore semaphore; // 信号量用于控制请求public TokenBucket(int capacity, int tokensPerSecond) {this.capacity = capacity;this.generationInterval = 1000 / tokensPerSecond;this.tokens = capacity;this.semaphore = new Semaphore(1);this.lastGenerationTime = System.currentTimeMillis();}public boolean tryAcquire() {// 获取信号量,确保令牌桶更新的线程独占执行try {semaphore.acquire();long currentTime = System.currentTimeMillis();long elapsedTime = currentTime - lastGenerationTime;// 计算新生成的令牌数量int newTokens = (int) (elapsedTime / generationInterval);if (newTokens > 0) {tokens = Math.min(capacity, tokens + newTokens);lastGenerationTime = currentTime;}// 尝试获取令牌if (tokens > 0) {tokens--;return true;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {semaphore.release();}return false;}
}

测试:

在这里插入图片描述


🌊漏桶算法(Leaky Bucket Algorithm)

💧漏桶算法的思想是,系统维护一个固定容量的漏桶,当请求到达时,漏桶以固定速率处理请求,不管请求的到达速率如何。如果漏桶已满,多余的请求将会被丢弃或排队等待。

💧漏桶算法的关键参数包括:

  • 桶容量(Bucket Capacity):表示漏桶的最大容量,即漏桶可以保存的最多请求数。
  • 漏水速率(Leak Rate):表示漏桶以多快的速率处理请求。

💧算法的基本工作流程如下:

  1. 当请求到达时,将请求放入漏桶中。
  2. 漏桶以恒定的速率处理请求,如果漏桶不为空,就从漏桶中移除一个请求并处理它。
  3. 如果漏桶为空,新的请求将被丢弃或等待,直到有空闲的容量。

💧漏桶算法的特点是无论请求的到达速率如何,处理请求的速率都是恒定的,因此可以用来平滑流量并限制突发请求。

🌊代码实现(Java)

import java.util.concurrent.TimeUnit;class LeakyBucket {private final int capacity; // 漏桶容量private final int rate; // 漏水速率 (请求/秒)private int water; // 当前水量private long lastLeakTime; // 上次漏水时间public LeakyBucket(int capacity, int rate) {this.capacity = capacity;this.rate = rate;this.water = 0;this.lastLeakTime = System.nanoTime();}public synchronized boolean tryConsume() {long now = System.nanoTime();long elapsedNanos = now - lastLeakTime;int leaked = (int) TimeUnit.NANOSECONDS.toSeconds(elapsedNanos) * rate;if (leaked > 0) {water = Math.max(0, water - leaked);lastLeakTime = now;}if (water < capacity) {water++;return true;} else {return false; // 漏桶已满,请求被拒绝}}
}

测试:

在这里插入图片描述


🌊总结

令牌桶算法和漏桶算法都是有用的限流工具,可用于保护系统免受过多请求的冲击。通过使用这些算法,我们可以更好地管理和控制流量,确保系统的稳定性和可用性。

  • 令牌桶算法:以恒定速率生成令牌,用于限制请求的平均速率,并可以应对瞬时流量峰值。
  • 漏桶算法:以恒定速率处理请求,用于平滑流量,不管请求的到达速率如何。

这两种算法都有自己的应用场景,选择哪种算法取决于需求。如果需要平滑流量并确保恒定的处理速率,可以选择漏桶算法;如果需要允许瞬时的流量峰值,可以选择令牌桶算法。

在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

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

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

相关文章

2023年Java核心技术面试第五篇(篇篇万字精讲)

目录 十 . HashMap&#xff0c;ConcurrentHashMap源码解析 10.1 HashMap 的源码解析&#xff1a; 10.1.1数据结构&#xff1a; 10.1.2哈希算法&#xff1a; 10.1.3解决哈希冲突&#xff1a; 10.1.4扩容机制&#xff1a; 10.1.5如何使用 HashMap&#xff1a; 10.2 HashMap 关注…

开源后台管理系统Geekplus Admin

本系统采用前后端分离开发模式&#xff0c;后端采用springboot开发技术栈&#xff0c;mybatis持久层框架&#xff0c;redis缓存&#xff0c;shiro认证授权框架&#xff0c;freemarker模版在线生成代码&#xff0c;websocket消息推送等&#xff0c;后台管理包含用户管理&#xf…

一例Vague病毒的分析

这是一例通过U盘传播的文件夹病毒&#xff0c;有收集用户文件的行为&#xff0c;但是&#xff0c;没有回传和远控行为&#xff0c;有点奇怪&#xff0c;其中的字符串进行了加密。 样本比较简单&#xff0c;使用IDA很容易就看明白了。 根据匹配到威胁情报&#xff0c;有叫Vague蠕…

【AI】文心一言的使用

一、获得内测资格&#xff1a; 1、点击网页链接申请&#xff1a;https://yiyan.baidu.com/ 2、点击加入体验&#xff0c;等待通过 二、获得AI伙伴内测名额 1、收到短信通知&#xff0c;点击链接 网页Link&#xff1a;https://chat.baidu.com/page/launch.html?fa&sourc…

人工智能在网络安全中的作用:当前的局限性和未来的可能性

人工智能 (AI) 激发了网络安全行业的想象力&#xff0c;有可能彻底改变安全和 IT 团队处理网络危机、漏洞和勒索软件攻击的方式。 然而&#xff0c;对人工智能的能力和局限性的现实理解至关重要&#xff0c;并且存在许多挑战阻碍人工智能对网络安全产生直接的变革性影响。 在…

【ES6】—使用 const 声明

一、不属于顶层对象window 使用const关键字 声明的变量&#xff0c;不会挂载到window属性上 const a 5 console.log(a) console.log(window.a) // 5 // undefined二、不允许重复声明 使用const关键字不允许重复声明相同的变量 cosnt a 5 cosnt a 6 // Uncaught SyntaxEr…

Postman如何做接口测试:什么?postman 还可以做压力测试?

我们都知道&#xff0c; postman 是一款很好用的接口测试工具。不过 postman 还可以做简单的压力测试&#xff0c;而且步骤只需要 2 步。 首先&#xff0c;打开 postman, 编写接口的请求参数。 然后&#xff0c;点击右下方的 runner 运行器&#xff0c;把需要测试的接口拖动到…

Linux实用运维脚本分享

Linux实用运维脚本分享&#x1f343; MySQL备份 目录备份 PING查询 磁盘IO检查 性能相关 进程相关 javadump.sh 常用工具安装 常用lib库安装 系统检查脚本 sed进阶 MySQL备份 #!/bin/bashset -eUSER"backup" PASSWORD"backup" # 数据库数据目录…

学习网络编程No.3【socket理论实战】

引言&#xff1a; 北京时间&#xff1a;2023/8/12/15:32&#xff0c;自前天晚上更新完文章&#xff0c;看了一下鹅厂新出的《扫毒3》摆烂至现在&#xff0c;不知道是长大了&#xff0c;还是近年港片就那样&#xff0c;给我的感觉不是很好&#xff0c;也可能是国内市场对港片不…

Vue 项目搭建

环境配置 1. 安装node.js 官网&#xff1a;nodejs&#xff08;推荐 v10 以上&#xff09; 官网&#xff1a;npm 是什么&#xff1f; 由于vue的安装与创建依赖node.js&#xff08;JavaScript的运行环境&#xff09;里的npm&#xff08;包管理和分发工具&#xff09;&#xff…

Python编程基础-函数

函数定义与调用 将完成某一特定功能并经常使用的代码编写成函数&#xff0c;在需要使用时直接调用 def 函数名(函数参数): 函数体 return 表达式或者值 def printHello(): #打印hello字符串print (hello)def printNum(): #输出0--9数字for i in range(0,10):print (i)return…

更新arm的linux编译工具链

虑到目前arm的gcc 5.5的工具链对C17语法支持不足&#xff0c;需要升级下工具链。 以下是详细步骤。使用官方提供的工具链 ARM官方的工具链网站&#xff1a; https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads bare-metal这个版本就是没有操作系统(裸机环…

“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会顺利召开

研讨会主题 8月10日&#xff0c;“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定&#xff08;专家建议稿&#xff09;》研讨会在浙江大学计算机创新技术研究院举办。 本次研讨会的主题聚焦于“智能网联汽车的数据安全与数据合规”&#xff0c;邀请行业主管部门和数据…

【音视频原理】图像相关概念 ① ( 像素 | 分辨率 | 位深 )

文章目录 一、图像相关概念1、像素2、分辨率3、位深 一、图像相关概念 图像相关概念 : 像素 : 图片基本单位 ;分辨率 : 图像的像素尺寸 ;位深 : 记录每个像素点颜色时使用的位数 ;帧率 : 一秒钟传输图片的帧数 , 单位 fps , Frame Per Second ;码率 : 单位时间内视频的数据流量…

什么文件传输协议才能保障跨国文件传输安全又稳定

在当今的全球化时代&#xff0c;跨国文件传输是一种常见而又重要的需求&#xff0c;无论是个人还是企业&#xff0c;都需要通过网络来分享和交换各种类型和大小的文件。但是&#xff0c;跨国文件传输也面临着许多挑战和风险&#xff0c;如何选择一个合适的文件传输协议&#xf…

机器学习与模式识别3(线性回归与逻辑回归)

一、线性回归与逻辑回归简介 线性回归主要功能是拟合数据&#xff0c;常用平方误差函数。 逻辑回归主要功能是区分数据&#xff0c;找到决策边界&#xff0c;常用交叉熵。 二、线性回归与逻辑回归的实现 1.线性回归 利用回归方程对一个或多个特征值和目标值之间的关系进行建模…

(排序) 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 ——【Leetcode每日一题】

❓剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 难度&#xff1a;简单 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的前半部分&#xff0c;所有偶数在数组的后半部分。 示例&#xff1a; 输入&#xff1a;nums [1…

02.案列项目Demo

1.创建项目 1. 创建项目 用pycharm 选择对应的编译器&#xff0c;输入对应的文件名&#xff0c;点击创建项目。删除默认外层生成的template和DIRS 配置项&#xff1a; 2. 创建App 创建appo1的命令&#xff1a; python manage.py startapp app01 如果使用pycharm>tool>…

mongodb.使用自带命令工具导出导入数据

在一次数据更新中&#xff0c;同事把老数据进行了清空操作&#xff0c;但是新的逻辑数据由于某种原因&#xff08;好像是她的电脑中病毒了&#xff09;&#xff0c;一直无法正常连接数据库进行数据插入&#xff0c;然后下午2点左右要给甲方演示&#xff0c;所以要紧急恢复本地的…

深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)

深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)。 一、简介 单点登录(Single Sign On),简称为 SSO。 它的解释是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 ❝ 所谓一次登录,处处登录。同样一处退出,处处退出。 ❞ 二…