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

2023-10-31 17:10
文章标签 算法 令牌 漏桶

本文主要是介绍【令牌桶算法与漏桶算法】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

                                                                              💧 令牌桶算法与漏桶算法 \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; // 漏桶已满,请求被拒绝}}
}

测试:

在这里插入图片描述


🌊总结

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

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

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

在这里插入图片描述


🐳结语

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

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

这篇关于【令牌桶算法与漏桶算法】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_58035032/article/details/132392513
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/316870

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1