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

在这里插入图片描述

                                                                              💧 令牌桶算法与漏桶算法 \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.rhkb.cn/news/97940.html

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

相关文章

【前端|JS实战第1篇】使用JS来实现属于自己的贪吃蛇游戏!

前言 贪吃蛇游戏是经典的小游戏&#xff0c;也是学习前端JS的一个很好的练习项目。在本教程中&#xff0c;我们将使用 JavaScript 来逐步构建一个贪吃蛇游戏。我们会从创建游戏区域开始&#xff0c;逐步添加蛇的移动、食物的生成以及游戏逻辑等功能。 &#x1f680; 作者简介&a…

韦东山-电子量产工具项目:业务系统

代码结构 所有代码都已通过测试跑通&#xff0c;其中代码结构如下&#xff1a; 一、include文件夹 1.1 common.h #ifndef _COMMON_H #define _COMMON_Htypedef struct Region {int iLeftUpX; //区域左上方的坐标int iLeftUpY; //区域左下方的坐标int iWidth; //区域宽…

java八股文面试[java基础]——String StringBuilder StringBuffer

String类型定义&#xff1a; final String 不可以继承 final char [] 不可以修改 String不可变的好处&#xff1a; hash值只需要算一次&#xff0c;当String作为map的key时&#xff0c; 不需要考虑hash改变 天然的线程安全 知识来源&#xff1a; 【基础】String、StringB…

Python web实战之细说 Django 的单元测试

关键词&#xff1a; Python Web 开发、Django、单元测试、测试驱动开发、TDD、测试框架、持续集成、自动化测试 大家好&#xff0c;今天&#xff0c;我将带领大家进入 Python Web 开发的新世界&#xff0c;深入探讨 Django 的单元测试。通过本文的实战案例和详细讲解&#xff…

ubuntu安装Microsoft Edge并设置为中文

1、下载 edge.deb 版本并安装 sudo dpkg -i microsoft-edg.deb 2. 设置默认中文显示 如果是通过.deb方式安装的&#xff1a; 打开默认安装路径下的microsoft-edge-dev文件&#xff0c;在文件最开头加上: export LANGUAGEZH-CN.UTF-8 &#xff0c;保存退出。 cd /opt/micr…

PHP8的字符串操作3-PHP8知识详解

今天继续分享字符串的操作&#xff0c;前面说到了字符串的去除空格和特殊字符&#xff0c;获取字符串的长度&#xff0c;截取字符串、检索字符串。 今天继续分享字符串的其他操作。如&#xff1a;替换字符串、分割和合成字符串。 5、替换字符串 替换字符串就是对指定字符串中…

【算法系列篇】滑动窗口

文章目录 前言什么是滑动窗口1.长度最小的子数组1.1 题目要求1.2 做题思路 1.3 Java代码实现2.无重复字符的最长子串2.1 题目要求2.2 做题思路2.3 Java代码实现 3.最大连续1的个数 III3.1 题目要求3.2 做题思路3.3 Java代码实现 4.将x减到0的最小操作数4.1 题目要求4.2 做题思路…

【仿写框架之仿写Tomact】四、封装HttpRequest对象(属性映射http请求报文)、HttpResponse对象(属性映射http响应报文)

文章目录 1、创建HttpRequest对象2、创建HttpResponse对象 1、创建HttpRequest对象 HttpRequest对象中的属性与HTTP协议中的内容对应&#xff0c;用于后序servlet从request中获取请求中的参数。 参照http请求报文&#xff1a; import java.io.BufferedReader; import java…

配置使用Gitee账号认证登录Grafana

三方社会化身份源 集成gitee第三方登录 第三方登录的原理 所谓第三方登录&#xff0c;实质就是 OAuth 授权。用户想要登录 A 网站&#xff0c;A 网站让用户提供第三方网站的数据&#xff0c;证明自己的身份。获取第三方网站的身份数据&#xff0c;就需要 OAuth 授权。 举例来…

ubuntu上使用osg3.2+osgearth2.9

一、介绍 在ubuntu上使用osgearth加载三维数字地球&#xff0c;首先要有osg和osgearth的库&#xff0c;这些可以直接使用apt-get下载安装&#xff0c;但是版本有些老&#xff0c;如果需要新版本的就需要自己编译。 #查看现有版本 sudo apt-cache madison openscenegraph #安装…

Python写一个创意五子棋游戏

前言 在本教程中&#xff0c;我们将使用Python写一个创意五子棋游戏 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python系列专栏 - 从零开始学python 首先 GomokuGame 类的构造函数 __ini…

小程序 CSS-in-JS 和原子化的另一种选择

小程序 CSS-in-JS 和原子化的另一种选择 小程序 CSS-in-JS 和原子化的另一种选择 介绍快速开始 pandacss 安装和配置 0. 安装和初始化 pandacss1. 配置 postcss2. 检查你的 panda.config.ts3. 修改 package.json 脚本4. 全局 css 注册 pandacss5. 配置的优化与别名 weapp-pand…

LeetCode 周赛上分之旅 #40 结合特征压缩的数位 DP 问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

07_缓存预热缓存雪崩缓存击穿缓存穿透

缓存预热&缓存雪崩&缓存击穿&缓存穿透 一、缓存预热 提前将数据从数据库同步到redis。 在程序启动的时候&#xff0c;直接将数据刷新到redis懒加载&#xff0c;用户访问的时候&#xff0c;第一次查询数据库&#xff0c;然后将数据写入redis 二、缓存雪崩 发生情…

Roxy-Wi 命令执行漏洞复现

漏洞描述 Roxy-WI是开源的一款用于管理 Haproxy、Nginx 和 Keepalived 服务器的 Web 界面 Roxy-WI 6.1.1.0 之前的版本存在安全漏洞,该漏洞源于系统命令可以通过 subprocess_execute 函数远程运行,远程攻击者利用该漏洞可以执行远程代码。 免责声明 技术文章仅供参考,任…

小程序前台Boot后台校园卡资金管理系统java web学校进销存食堂挂失jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 小程序前台Boot后台校园卡资金管理系统 系统有2权限&…

Nuxt3_1_路由+页面+组件+资源+样式 使用及实例

1、 简介 1.1 开发必备 node版本 v16.10.0 我使用的是16.14.0编辑器推荐使用Volar Extension 的VS code插件Terminal 运行nuxt指令 1.2 环境搭建 安装项目&#xff1a; npx nuxilatest init [first_nuxt3]进入项目目录&#xff1a; cd [first_nuxt3]安装依赖&#xff1a;n…

【蓝桥杯】[递归]母牛的故事

原题链接&#xff1a;https://www.dotcpp.com/oj/problem1004.html 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 我们列一个年份和母牛数量的表格&#xff1a; 通过观察&#xff0c;找规律&#xff0c;我们发现&#xff1a; 当年份小于等于4时&…

如何在出差期间远程访问企业ERP系统?内网穿透解决您的难题!

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻&#xff0c;不管是财务、生产、销售还是采购&#xff0c;都需要用到ERP系统来协助。…