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

在这里插入图片描述

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

测试:

在这里插入图片描述


🌊总结

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

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

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

在这里插入图片描述


🐳结语

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——螺旋矩阵

题目 给定一个m x n大小的矩阵&#xff08;m行&#xff0c;n列&#xff09;&#xff0c;按螺旋的顺序返回矩阵中的所有元素。 数据范围&#xff1a;0≤n,m≤10&#xff0c;矩阵中任意元素都满足 ∣val∣≤100 要求&#xff1a;空间复杂度 O(nm) &#xff0c;时间复杂度 O(nm)…

李沐pytorch学习-卷积网络及其实现

一、卷积概述 1.1 基本定义 卷积计算过程如图1所示&#xff0c;即输入矩阵和核函数&#xff08;filter&#xff09;对应的位置相乘&#xff0c;然后相加得到输出对应位置的数。 图1. 卷积计算过程 该过程可以形象地从图2中展现。 图2. 二维卷积示意图 1.2 实现互相关运算的代…

01-关于new Object()的问题

美团面试题关于Object o = new Object()的几个问题。 1、对象在内存中的存储布局? 实例化一个对象,在堆区开辟一段空间。 堆区由markword、类型指针(class point)、实例数据、对齐组成。 markword:由8个字节组成。 类型指针(class point):就是指向某class文件的指针,…

【3Ds Max】弯曲命令的简单使用

简介 在3ds Max中&#xff0c;"弯曲"&#xff08;Bend&#xff09;是一种用于在平面或曲面上创建弯曲效果的建模命令。使用弯曲命令&#xff0c;您可以将对象沿特定轴向弯曲&#xff0c;从而创建出各种弯曲的几何形状。以下是使用3ds Max中的弯曲命令的基本步骤&…

spring源码分析bean的生命周期(下)

doGetBean()执行过程 createBean()执行过程 一、DependsOn注解 spring创建对象之前会判断类上是否加了DependsOn注解&#xff0c;加了会遍历然后会添加到一个map中&#xff0c;spring会先创建DependsOn注解指定的类 二、spring类加载器 在合并BeanDefinition&#xff0c;确定…

solidwords(5)

我们打算从上面画出总体&#xff0c;再从上面、侧面切除 最后成品

AI重新定义音视频生产力“新范式”

// 编者按&#xff1a;AIGC无疑是当下的热门话题和场景。面对AI带来的技术变革和算力挑战&#xff0c;该如何应对&#xff1f;LiveVideoStackCon 2023上海站邀请到了网心科技副总裁武磊为我们分享网心在面对AI应用场景和业务需求下的实践经验。 文/武磊 编辑/LiveVideoStack …

2022年国考行政执法卷-判断推理

去掉重复题 例题 例题 例题 例题 例题 例题 例题 例题 例题 例题 类比推理 例题 例题 例题 例题 例题 例题

mac上如何压缩视频大小?

mac上如何压缩视频大小&#xff1f;由于视频文件体积庞大&#xff0c;常常会占据我们设备的大量存储空间。通常情况下&#xff0c;我们选择删除视频以释放内存&#xff0c;但这将永久丢失它们。然而&#xff0c;有一种更好的方法可以在不删除视频的情况下减小内存占用&#xff…

Linux网络编程:Socket套接字编程(Server服务器 Client客户端)

文章目录&#xff1a; 一&#xff1a;定义和流程分析 1.定义 2.流程分析 3.网络字节序 二&#xff1a;相关函数 IP地址转换函数inet_pton inet_ntop&#xff08;本地字节序 网络字节序&#xff09; socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结…

计算机竞赛 图像检索算法

文章目录 1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 图像检索算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff…

SpringCloud Gateway:status: 503 error: Service Unavailable

使用SpringCloud Gateway路由请求时&#xff0c;出现如下错误 yml配置如下&#xff1a; 可能的一种原因是&#xff1a;yml配置了gateway.discovery.locator.enabledtrue&#xff0c;此时gateway会使用负载均衡模式路由请求&#xff0c;但是SpringCloud Alibaba删除了Ribbon的…

【es6】中的Generator

Generator 一、Generator 是什么&#xff1f;1.1 与普通函数写法不一样&#xff0c;有两个不同 二、Generator 使用2.1 书写方法 三、yield语句3.1 yield和return3.2 注意事项3.3 yield*语句3.4 yield*应用 四、next方法4.1参数 总结 一、Generator 是什么&#xff1f; Genera…

优化GitHub网站访问慢的问题

方法一、修改host文件解决 大型网站服务器都不会是只有一台服务器,而是多台服务器组成的集群一起对外提供服务。 使用站长工具测速&#xff0c;找一个速度比较快的服务器。 图中可以看到140.82.121.4这个ip比较快&#xff0c; 下面修改hosts: Mac 在 /etc/hosts 中&#x…

Dubbo高手之路3,Dubbo服务消费详解

目录 引言1. 介绍 Dubbo 服务消费的详解的目的和背景2. 概述 Dubbo 服务消费的过程和核心概念 一、Dubbo 服务消费的基础知识1. Dubbo 服务消费的架构和流程2. Dubbo 服务消费的基本配置和使用方法 二、Dubbo 服务消费的注册与发现1. Dubbo 服务消费的注册中心和发布中心的基本…

帆软大屏2.0企业制作

&#xfffc; 数字化观点中心 / 当前页 如何从0-1制作数据大屏&#xff0c;我用大白话给你解释清楚了 文 | 商业智能BI相关文章 阅读次数&#xff1a;18,192 次浏览 2023-06-08 11:51:49 好莱坞大片《摩天营救》中有这么一个场景&#xff1a; &#xfffc; 你可以看见反派大b…

CentOS7.9手工配置静态网络流程

进入网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 配置 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" //static 配置静态网络 DEFROUTE"yes" IPV4_FAILURE_FATAL"no…

2. Linux Server 20.04 Qt5.14.2配置Jetson Orin Nano Developer Kit 交叉编译环境

最近公司给了我一块Jetson Orin Nano的板子&#xff0c;先刷了系统&#xff08;1.Jetson Orin Nano Developer Kit系统刷机&#xff09;又让我搭建交叉编译环境&#xff0c;所以有了下面的文章 一 :Qt5.14.2交叉编译环境安装 1.准备 1.1设备环境 1.1.1 Server: Ubuntu20.0…

vue2+Spring Boot2.7 大文件分片上传

之前我们文章 手把手带大家实现 vue2Spring Boot2.7 文件上传功能 将了上传文件 但如果文件很大 就不太好处理了 按正常情况甚至因为超量而报错 这里 我弄了个足够大的文件 我们先搭建 Spring Boot2.7 环境 首先 application.yml 代码编写如下 server:port: 80 upload:path:…

前端对文件转换处理的一些常用方法

文章目录 0&#xff0c;前言1&#xff0c;将图片的url网络链接(http://) 转为base64格式2&#xff0c;将base64的图片数据转换为file文件3&#xff0c;将以base64的图片数据转换为Blob4&#xff0c;将file文件转化为base645&#xff0c;将file文件转换为Blob6&#xff0c;获取文…