C++实现令牌桶过滤算法

什么是令牌桶算法

令牌桶算法通过限制令牌桶的固定容量,实现对资源以及流量的延迟控制。请求者需先获取令牌,方可执行动作。若令牌桶内具有足够令牌便可通过消耗相等数量放过请求;而若令牌不足,则会拒绝请求。

该算法具备平滑的资源使用率控制功能,有效避免突发流量对系统的破坏。此外,令牌桶算法还适用于流量控制、预防DDoS攻击及防止资源过载等多种场景。同时,因其能根据需求动态调整填充速率,故在各种流量模式下均可适用。

操作示例

当然,以下是一个示例的C++代码,用于实现令牌桶过滤算法。令牌桶算法用于限制对一组资源的访问速率,它通过维护一个固定容量的令牌桶来控制对资源的访问。

#include <iostream>
#include <chrono>
#include <thread>class TokenBucket {
public:
TokenBucket(int capacity, int rate) : capacity_(capacity), rate_(rate), tokens_(capacity) {}bool consume(int tokens) {if (tokens <= tokens_) {tokens_ -= tokens;return true;} else {return false;}
}void refill() {while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));tokens_ = std::min(capacity_, tokens_ + rate_);}
}private:
int capacity_;
int rate_;
int tokens_;
};int main() {TokenBucket bucket(10, 2); // 令牌桶容量为10,每秒增加2个令牌// 启动令牌桶的自动补充线程std::thread refill_thread([&] { bucket.refill(); });// 模拟资源访问for (int i = 0; i < 20; ++i) {if (bucket.consume(1)) {std::cout << "Access granted" << std::endl;} else {std::cout << "Access denied" << std::endl;}std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟资源访问间隔}// 等待自动补充线程结束refill_thread.join();return 0;
}

这段代码主要是创建了一个TokenBucket类,其中包含了令牌桶的容量、速率和当前令牌数量。主函数模拟了对资源的访问,并在访问时检查是否有足够的令牌。

令牌桶算法VS漏桶算法

令牌桶算法,它生成的令牌速率是一定的。当短时间内有大量的流量来请求的时候,他会瞬间获取大量的令牌,不会对他的请求产生太大的影响。与之相对的可能就是漏桶算法,漏洞算法它控制的是请求速率,而不是向令牌桶一样去控制它的生成速率。但是漏桶算法它有一个特点,就是当地大量的流量进来的时候,它实际请求的流量也是固定的。所以这就要看你当前使用的场景。

总结

总的来说,令牌桶算法是一种简单且实用的限速方式,适用于网络流量控制、API调用限制以及系统资源管理等领域,经常可能会在gateway里面去用到。一些常用的流量限制,是我们常说的限流处理。在日常使用中,可以根据其中生产令牌速率的特点,去选择合适的场景使用它。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C语言停车场模型详解

C语言停车场模型详解 1. 引言2. 代码概述3. 代码详解3.1 定义常量和数据结构3.2 初始化车库3.3 查找车辆所在车库3.4 查找车辆所在的车位3.5 打印车库状态3.6 打印等候车辆3.7 车辆入库3.8 车辆出库3.9 菜单功能3.10 主函数 5.效果展示5.完整代码6. 总结 1. 引言 本文将介绍一…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

生成式 AI 原生开发

如何成为生成式AI原生开发者&#xff0c;快速进入&#xff1a; 下一站 GenAI QCon 上海站喊你上车啦&#xff01; 无限构建&#xff0c;成为生成式 AI 原生开发者&#xff0c;12 月 28 日&#xff0c;下一站 GenAI 巴士即将抵达 QCon 全球软件开发大会上海站&#xff0c;码…

人大女王金融硕士为何是在职金融人士提升自己的首选?一起来看看

在这个经济飞速发展的时代&#xff0c;职场竞争愈发激烈&#xff0c;如果一味的安于现状&#xff0c;那么很有可能被社会所淘汰。近年来&#xff0c;金融行业的发展更是迅速&#xff0c;对于高端人才的需求也越来越大。所以对于从事这行的工作者来说&#xff0c;在职研究生就是…

QML —— RadioButton的两个经典示例(附完整源码)

示例1-效果 示例2-效果 实例1 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Text{id: classNametext: qsTr("--&quo…

金融贷款行业怎么精准获客,电销打吐了!教你两招

助贷行业&#xff0c;一般都会设有kpi&#xff0c;压力竞争都不小。虽然现在贷款电销大家对此意见不同&#xff0c;但是&#xff0c;不可否认&#xff0c;这个行业&#xff0c;电销就是它们最快速的获客方式。只要耐得住性子&#xff0c;有一份精准的话单&#xff0c;就可以开工…

在线教育系统源码解读:定制化企业培训APP的开发策略

当下&#xff0c;企业培训正经历着一场数字化的迭代&#xff0c;定制化企业培训APP应运而生&#xff0c;成为提升员工技能、推动企业发展的重要工具。下文小编将与大家一同深入了解在线教育系统的源码&#xff0c;探讨开发定制化企业培训APP的策略&#xff0c;以满足不同企业的…

AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

yolov8 细胞分割数据集准备及训练

1、数据 下载:https://universe.roboflow.com/motherson-hm/5-part-diff 500来张,5个类别(嗜碱性细胞、嗜酸细胞、淋巴细胞、单核细胞、中性粒细胞) yolo 分割数据标注格式: 与检测类似,就是坐标分割有多个 2、训练 训练yaml: seg_data.yaml (与检测格式一样) …

代码随想录算法训练营day1|704.二分查找、27.移除元素

第一章 数组 part01 今日任务 数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 详细布置 数组理论基础 文章链接&#xff1a;代码随想录 题目建议&#xff1a; 了解一下数组基础&#xff0c;以及数组的内存空间地址&#xff0c;数组也没那么简单。 704. 二…

玩转安卓手机录屏,轻松掌握录屏技巧!

“安卓手机有录屏功能吗&#xff1f;新买了一部安卓手机&#xff0c;因为之前都是在用苹果手机&#xff0c;所以有点不习惯&#xff0c;最近需要用到录屏功能&#xff0c;但怎么都找不到&#xff0c;希望大家教教我&#xff0c;安卓手机怎么录屏&#xff1f;” 在现代社交媒体…

Redis中RDB和AOF

Redis中RDB和AOF 定时间间隔执行数据集的时间快照&#xff0c;把某一时刻数据和妆容以文件的形式写到磁盘上&#xff0c;也就是快照。 配置文件 如果是普通安装方式可以跳过&#xff0c;如果是docker安装&#xff0c;需要到官网下载redis.conf配置文件到本地&#xff0c;地址…

常见HTTP 500错误发生原因及解决办法剖析

​  对于网站运营者来说&#xff0c;提到500内部服务器错误并不陌生。互联网行业对它的称呼有好几种&#xff0c;如“500内部服务器错误”、“HTTP 500 - 内部服务器错误”、“临时错误 (500)”、“内部服务器错误”。尽管叫法不同&#xff0c;但根本问题是相同的。 目前&…

单片机外设矩阵键盘之行列扫描识别原理与示例

单片机外设矩阵键盘之行列扫描识别原理与示例 1.概述 这篇文章介绍单片机通过行列扫描的方式识别矩阵键盘的按键&#xff0c;通过程序执行相应的操作。 2.行列扫描识别原理 2.1.独立按键识别原理 为什么需要矩阵按键 独立按键操作简单&#xff0c;当数量较多时候会占用单片机…

Talk | ACM MM 2023最佳论文,CATR:基于组合依赖和音频查询的视频分割模型

本期为TechBeat人工智能社区第558期线上Talk。 北京时间12月27日(周三)20:00&#xff0c;浙江大学博士生—李可欣的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “CATR-基于组合依赖和音频查询的视频分割模型”&#xff0c;介绍了她的团队在基于组…

BDTC2023:CloudberryDB开源创新与实践

中国大数据技术大会&#xff08;BDTC&#xff09;由中国计算机学会&#xff08;CCF&#xff09;创立于2008年&#xff0c;已经成为国内外极具行业实践的专业大数据交流平台。12月22日-24日&#xff0c;第十七届中国大数据技术大会&#xff08;BDTC 2023&#xff09;在广州举行。…

【map】【滑动窗口】【优先队列】LeetCode480滑动窗口中位数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 map 优先队列 题目 中位数是有序序列最中间的那个数。如果序列的长度是偶数&#xff0c;则没有最中间的数&#xff1b;此时中位数是最中间的两个数的平均数。 例如&#xf…

【日常聊聊】编程语言的未来:趋势、多样性、人工智能融合、教育与生态系统

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 1. 编程语言的发展趋势 1.1 新语言和编程范式的涌现 1.2 影响和挑战 2. 编程语言的多样性 2.1 互操作性和可移…

8.小明和完美序列

题目 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();Map<Integer,Intege…

为什么企业需要客户crm系统?

客户CRM提供数据储存&#xff0c;数据调配&#xff0c;数据分析。让传统的人工操作&#xff0c;让系统去完成。企业只需要提供原始数据就行了。举几个栗子&#xff1a; 1、客户资料的集中管理&#xff1a;可以集中存储和管理客户信息&#xff0c;包括联系方式、工商信息&#…