限流算法詳解:固定窗口、滑動窗口、令牌桶與漏桶算法全面對比

限流(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
英文地址,請注明出處:http://en.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…