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

news2025/1/18 20:22:01

什么是令牌桶算法

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

该算法具备平滑的资源使用率控制功能,有效避免突发流量对系统的破坏。此外,令牌桶算法还适用于流量控制、预防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://www.coloradmin.cn/o/1340144.html

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

相关文章

OpenStack搭建和部署

Centos官网qcow2镜像修改root账号密码&#xff0c;开启ssh等 wget http://172.16.20.10/vmtemplate/KVM/wangrui/Debian/debian-10.2.0-openstack-amd64.qcow2 一、查看镜像文件信息 [debian-10.2-cloud] nameDebian 10.2.0 (Buster) Cloud osinfodebian10 archx86_64 fi…

洛谷P1498 南蛮图腾

题目背景 自从到了南蛮之地&#xff0c;孔明不仅把孟获收拾的服服帖帖&#xff0c;而且还发现了不少少数民族的智慧&#xff0c;他发现少数民族的图腾往往有着一种分形的效果&#xff0c;在得到了酋长的传授后&#xff0c;孔明掌握了不少绘图技术&#xff0c;但唯独不会画他们…

nginx原理和配置项详解

一、nginx原理 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。其工作原理和配置项如下&#xff1a; 工作原理&#xff1a; 反向代理&#xff1a;Nginx可以作为反向代理服务器&#xff0c;接收客户端的请求&#xff0c;然后将请求转…

GIT提交、回滚等基本操作记录

1、add文件时warning: LF will be replaced by CRLF in .idea/workspace.xml. 原因&#xff1a;windows中的换行符为 CRLF&#xff0c; 而在Linux下的换行符为LF&#xff0c;所以在执行add . 时会出现以下提示 解决&#xff1a;git config core.autocrlf false 2、GIT命令&…

【linux】如何查看服务器磁盘IO性能

查看服务器磁盘IO性能 在服务器运维过程中&#xff0c;了解服务器的磁盘IO性能是非常重要的。磁盘IO性能直接影响到服务器的响应速度和处理能力。本文将介绍如何使用dd命令来查看服务器磁盘IO性能。 1. 什么是dd命令&#xff1f; dd命令是Linux系统中的一个非常强大的工具&a…

C++ 之LeetCode刷题记录(三)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 13、罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c…

Java开发框架和中间件面试题(8)

目录 82.Mybatis一级缓存&#xff0c;二级缓存&#xff1f; 83.Mybatis如何防止SQL注入&#xff1f; 84.mybatis中resultType和resultMap有什么区别&#xff1f; 85.如何在SpringBoot中禁用Actuator断点安全性&#xff1f; 86.什么是SpringBoot&#xff1f;SpringBoot有哪些…

1.3MySQL中的自连接

自己的表和自己连接&#xff0c;核心&#xff1a;一张表拆为两张一样的表。 语法&#xff1a;select 字段列表 from 表 [as] 表别名1,表 [as] 表别名2 where 条件...; 关于怎样把一个表拆分成一个表&#xff0c;只要给它们分别取别名就行 categoryidpidcategoryname21信息…

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

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

Flink1.17实战教程(第二篇:DataStream API)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

MYSQL一一外键约束

概念&#xff1a;外键用来让两张表的数据之间建立联系&#xff0c;从而保证数据的一致性和完整性 建立外键&#xff1a; ①这是在建立表的时候建立外键的方法 ②这是在建立完表之后建立外键的方法&#xff1a; 删除外键&#xff1a; 现在有一张员工表&#xff08;emp&#xf…

【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了&#xff0c;我这里直接是使用代码。 基础准备&#xff1a; 创建实体类&#xff1a; Data // 索引名 IndexName("test_jc") public class TestJcES {// id注解IndexId(type IdType.CUSTOMI…

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源&#xff08;内存、负载、磁盘容量&#xff09;》&#xff0c;这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…

CSDN规则详解——csdn那些你不知道的事儿(点赞、评论、收藏)

文章目录 每日一句正能量前言点赞评论收藏原力等级和博客等级后记 每日一句正能量 “只有奋斗者才能成为胜利者&#xff0c;只有坚持者才能创造奇迹。” - 迈克尔乔丹 这句话来自于世界著名篮球运动员迈克尔乔丹&#xff0c;他以无与伦比的天赋和努力成为了篮球界的传奇人物。他…

产品经理如何培养思维模式和创新能力?

作为一名产品经理&#xff0c;我们需要具备一定的思维模式和创新能力&#xff0c;以应对不断变化的市场和技术环境。在本文中&#xff0c;我将分享一些培养产品经理思维模式和创新能力的方法。 一、培养市场洞察力 作为产品经理&#xff0c;我们需要深入了解市场和用户需求&a…

表单(HTML)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>个人信息</title></head><body><h1>个人信息</h1><form><fieldset><legend>基本信息</legend><label for"…

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

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

爬虫工作量由小到大的思维转变---<第三十章 Scrapy Redis 第一步(配置同步redis)>

前言: 要迈向scrapy-redis进行编写了;首要的一步是,如何让他们互通?也就是让多台电脑连一个任务(这后面会讲); 现在来做一个准备工作,配置好redis的同步!! 针对的是windows版本的redis同步,实现主服务和从服务共享一个redis库; 正文: 正常的redis for windows 的安装这里就…

制作gif动图软件,视频转gif动图生成器

生活在这个快节奏的时代&#xff0c;我们总是希望能够抓住那些转瞬即逝的美好。而gif动图&#xff0c;正是这样一种能够让时间静止、让美好定格的存在。从视频到gif动图&#xff0c;不仅仅是格式的转换&#xff0c;更是情感的传递与分享。 所需工具&#xff1a; 一个【媒体梦…

Fiddler工具 — 2.补充:HTTP协议介绍(一)

1、HTTP协议介绍 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写&#xff0c;是用于从万维网(WWW:World Wide Web )服务器传输超文本&#xff08;也可以说是资源&#xff09;到本地浏览器的传送协议。 HTTP协议是基于TCP协议的应用层协议&#xff0c;它不关心…