限流算法详解:固定窗口、滑动窗口、令牌桶与漏桶算法全面对比

限流(Rate Limiting)是保障系统稳定性和服务质量的关键机制,尤其在高并发、突发流量、攻击防护等场景中至关重要。

本文将详细介绍四种主流限流算法:

  • 固定窗口(Fixed Window)

  • 滑动窗口(Sliding Window)

  • 令牌桶(Token Bucket)

  • 漏桶算法(Leaky Bucket)

我们将从原理、实现方式、优缺点和适用场景四个维度进行深入分析和对比。


一、固定窗口(Fixed Window)

原理:将时间划分为固定长度窗口,统计每个窗口内的请求数,超过上限则拒绝。

实现方式(常用 Redis INCR + EXPIRE):

key = f"req:{user_id}:{current_minute}"
count = redis.incr(key)
if count == 1:redis.expire(key, 60)
if count > threshold:reject()

优点

  • 实现简单,性能高。

  • Redis 支持天然适配。

缺点

  • 临界突刺问题:在两个窗口交界点,可能放行两倍请求。

适用场景

  • 精度要求不高的接口。

  • 管控类后台系统。


二、滑动窗口(Sliding Window)

1. 滑动日志(Sliding Log)

原理:记录每次请求时间戳,实时清理超出时间窗口的旧请求,判断窗口内数量。

优点

  • 流量限制更精确。

  • 避免突刺。

缺点

  • 需要维护时间戳列表,内存消耗较大。

2. 滑动窗口计数器(Sliding Window Counter)

原理:将一个窗口拆分为多个小窗口,每个子窗口统计请求数,根据时间加权合并。

优点

  • 性能和精度之间较好平衡。

适用场景

  • 高并发、登录、敏感操作等流控要求较高的业务。


三、令牌桶算法(Token Bucket)

原理

  • 系统以固定速率放入“令牌”到桶中;

  • 每次请求需要“取一个令牌”才能通过;

  • 桶容量有限,超过上限的令牌被丢弃;

  • 若桶为空,请求被限流(或排队等)。

示意图

+----------+
| 令牌桶    |
|          |<-- 固定速率生成令牌
|   [ ]    |
+----------+↓请求来取令牌 -> 成功 or 被限流

优点

  • 支持突发流量(令牌可积累)。

  • 灵活控制平均速率与突发能力。

  • Guava / Nginx 都有成熟实现。

缺点

  • 实现较复杂。

  • 依赖精准时间调度。

适用场景

  • 接口限频,突发高并发业务。

  • LLM API 限流 / OpenAI、Stripe 等系统。


四、漏桶算法(Leaky Bucket)

原理

  • 所有请求先进入一个桶中;

  • 桶以固定速率“漏水”处理请求;

  • 桶满时,新请求要么被丢弃,要么排队等待。

示意图

请求 → 桶(队列) → 以恒定速率处理(漏水)↑桶满则拒绝或排队

实现方式

  • 可以用一个队列存储请求;

  • 后台定期以固定速率出队并处理请求。

优点

  • 平滑处理请求流量,保持处理速率稳定。

  • 防止服务被瞬时流量压垮。

缺点

  • 不支持突发流量(桶中积压,排队延迟)。

  • 实现复杂度略高于令牌桶。

适用场景

  • 网关、负载均衡器的请求调度。

  • 强调处理速率恒定的后台任务系统。


五、算法对比总结

特性固定窗口滑动窗口令牌桶漏桶
实现复杂度⭐(简单)⭐⭐(中等)⭐⭐⭐(中高)⭐⭐(中等)
限流精度中等
是否支持突发请求
是否平滑
是否常用✅(Redis)✅(Sentinel)✅(Guava、Nginx)✅(调度系统)

六、实战建议

  • 简单限流场景(如后台管理):使用 固定窗口 + Redis 即可。

  • 高并发接口限频:推荐 滑动窗口令牌桶,后者更适合突发请求。

  • 需要平滑处理队列任务:选择 漏桶算法


七、结语

限流并不是一刀切的“阻止请求”,而是为系统争取喘息空间。不同的限流算法背后体现的是不同的设计哲学与业务权衡。

选对限流算法,既可以保护系统,又能优化用户体验。

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

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

相关文章

Sentinel 搭建应用层面与网关层面的流控保护

源码&#xff1a;妖精的尾巴/spring-cloud-alibaba Nacos 和 Sentinel Dashboard 我这里全是使用window 本地运行的&#xff0c;需要自行下载运行 服务层面&#xff1a; 当你在某个具体的服务上使用Sentinel时&#xff0c;更多的是关注该服务内部资源的保护。例如&#xff0c…

纯血鸿蒙 AudioRenderer+AudioCapturer+RingBuffer 实现麦克风采集+发声

总共两个类&#xff0c;放到代码里&#xff0c;就可以快速完成K歌的效果&#xff0c;但应用层这么做延迟是比较高的&#xff0c;只是做一个分享。 类代码 import { audio } from kit.AudioKit; import { BusinessError } from kit.BasicServicesKit; import { AudioBufferFlow,…

洛谷 P1601 A+B Problem(高精)普及-

题目描述 高精度加法&#xff0c;相当于 ab problem&#xff0c;不用考虑负数。 输入格式 分两行输入。a,b≤10500a,b \leq 10^{500}a,b≤10500。 输出格式 输出只有一行&#xff0c;代表 ababab 的值。 输入输出样例 #1 输入 #1 1 1输出 #1 2输入输出样例 #2 输入 #2 1001 909…

Matrix Theory study notes[6]

文章目录linear spacereferenceslinear space a basis of linear space VkV^kVk,which is x1,x2,...xkx_1,x_2,...x_kx1​,x2​,...xk​,can be called as a coordinate system.let vector v∈Vkv \in V^kv∈Vk and it can be linear expressed on this basis as va1x1a2x2...…

专线与专线之间的区别

下面我们从定义、技术特点、适用场景、优缺点等多个维度来详细对比&#xff1a;✅ 一、四种方案简要定义技术方案定义MPLS 专线运营商基于 MPLS 技术提供的私有虚拟网络&#xff0c;逻辑隔离、安全可靠VPN over Internet利用公网加密通道&#xff08;如IPSec&#xff09;构建虚…

Git工作流:团队协作的最佳实践

目录 一、什么是 Git 工作流&#xff1f;为什么需要它&#xff1f; 二、基础&#xff1a;Git 分支核心概念 三、主流 Git 工作流实战指南 1. 集中式工作流&#xff08;Centralized Workflow&#xff09;&#xff1a;适合小团队 / 新手 操作步骤&#xff1a; 优缺点&#…

算法竞赛阶段二-数据结构(35)数据结构单链表模拟实现

//链表--链式存储的线性表 //存信息和下一个节点位置&#xff0c;数据域和指针域合起来叫节点 //带头&#xff08;哨兵位&#xff09;下标为0 //单向&#xff0c;双向&#xff0c;循环链表 //实现 单 //俩足够大数组 // elem&#xff0c;数据域 // next &#xff0c;指针域…

《Computational principles and challenges in single-cell data integration》

1. 引言&#xff1a;单细胞数据整合的背景与重要性单细胞基因组学技术&#xff08;如scRNA-seq、scATAC-seq等&#xff09;近年来快速发展&#xff0c;能够以单细胞分辨率揭示细胞异质性和分子机制。然而&#xff0c;不同实验、样本和数据模态&#xff08;如RNA表达、DNA甲基化…

蔚来汽车携手通义灵码入选 2025 世界人工智能大会标杆案例

7月28日&#xff0c;在2025年世界人工智能大会上&#xff0c;通义灵码助力蔚来汽车研发效能升级成功入选2025年“人工智能”行业标杆案例荟萃。蔚来汽车已有近 1000 名工程师常态化使用通义灵码&#xff0c;AI 生成代码占比超 30%&#xff0c;尤其在蔚来“天探”AI自检系统的建…

Spring Boot中的this::语法糖详解

文章目录前言什么是方法引用&#xff08;Method Reference&#xff09;基本语法方法引用的四种类型1. 静态方法引用2. 实例方法引用&#xff08;特定对象&#xff09;3. 实例方法引用&#xff08;任意对象&#xff09;4. 构造器引用this::在Spring Boot中的应用场景1. Service层…

VitePress学习笔记

VitePress学习笔记VitePress学习搭建和运行编写内容mdvue配置站点配置配置searchsearch 提示词替换使用第三方主题自定义主题设置文档根目录国际化文档navsidebarsearch其他插件vitepress插件markdown-it插件项目开发原始需求和方案自动化流程权限限制VitePress学习 搭建和运行…

C#_创建自己的MyList列表

定义一个数据自己的列表MyList 使用上述描述列表的方式(数组) 列表内也要定义属于自己的方法 例如 Sort排序 Add添加 等等....思路┌─────────────────────────────────────────────────────────────────…

记录Linux下ping外网失败的问题

最近在RK3568上进行开发测试&#xff0c;需要测试一下网络环境&#xff0c;能否通过浏览器访问外部网络。测试情况如下&#xff1a; 1、ping内网、网关ip能ping通 2、ping外网ping不通 情况分析&#xff1a; 1、ping外网失败&#xff08;ping 8.8.8.8也ping不通&#xff0c;说…

Redis 键值对操作详解:Python 实现指南

一、环境准备 1. 安装依赖库 pip install redis2. 连接 Redis 数据库 import redis# 创建 Redis 客户端连接 r redis.Redis(hostlocalhost, # Redis 服务器地址port6379, # Redis 端口db0, # 数据库编号&#xff08;0~15&#xff09;passwordNone, …

制造业企业大文件传输的痛点有哪些?

在全球化与数字化的浪潮下&#xff0c;制造业企业的大文件传输需求日益凸显&#xff0c;然而诸多痛点也随之而来&#xff0c;严重制约着企业的高效运营与发展。复杂网络环境导致传输稳定性差制造业企业常涉及跨地域、跨国的业务合作与数据交流&#xff0c;网络环境复杂多变。在…

低速信号设计之 MDIO 篇

一、引言​ 在服务器的网络子系统中,MDIO(Management Data Input/Output)总线虽然传输速率相对较低,却扮演着极为关键的角色。它主要负责在 MAC(Media Access Control)层器件与 PHY(Physical Layer)层器件之间搭建起通信的桥梁,实现对 PHY 层器件的有效管理与状态监控…

AR技术赋能航空维修:精度与效率的飞跃

在航空工业领域&#xff0c;飞机维修与装配的精度要求越来越高。传统的维修方法依赖人工操作和经验判断&#xff0c;容易产生误差。随着增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术的引入&#xff0c;航空维修迎来了革命性的变化。本文将探讨AR技术在航空维修中…

设计模式实战:自定义SpringIOC(理论分析)

自定义SpringIOC&#xff08;理论分析&#xff09; 上一篇&#xff1a;设计模式开源实战&#xff1a;观察者模式不知道怎么用&#xff1f;手撕Spring源码中跟着大佬学编程 上一篇我们研究了大佬在Spring源码中使用的观察者模式&#xff0c;今天我们再来聊聊Spring的核心功能—…

人工智能如何改变项目管理:应用、影响与趋势

人工智能如何改变项目管理&#xff1a;应用、影响与趋势1. 人工智能如何提升项目规划与进度安排2. 人工智能在资源分配与优化中的应用3. 人工智能用于风险管理4. 人工智能用于团队协作与交流5. 人工智能用于项目监控与报告6. 集成人工智能的项目管理软件6.1 Wrike6.2 ClickUp6.…

【MySql】事务的原理

​ 【MySql】事务的原理数据库的隔离级别原理读未提交读已提交可重复读&#xff08;Repeatable Read&#xff09;串行化&#xff08;最高的隔离级别&#xff0c;强制事务串行执行&#xff0c;避免了所有并发问题&#xff09;MVCC&#xff08;Multi-Version Concurrency Control…