常用4種限流演算法介紹及比較

2021-10-17 14:35:19 字數 1354 閱讀 1543

1、計數器(固定視窗)演算法

計數器演算法是使用計數器在週期內累加訪問次數,當達到設定的限流值時,觸發限流策略。下乙個週期開始時,進行清零,重新計數。此演算法在單機還是分布式環境下實現都非常簡單,使用redis的incr原子自增性和執行緒安全即可輕鬆實現。

這個演算法通常用於qps限流和統計總訪問量,對於秒級以上的時間週期來說,會存在乙個非常嚴重的問題,那就是臨界問題,如下圖:

假設1min內伺服器的負載能力為100,因此乙個週期的訪問量限制在100,然而在第乙個週期的最後5秒和下乙個週期的開始5秒時間段內,分別湧入100的訪問量,雖然沒有超過每個週期的限制量,但是整體上10秒內已達到200的訪問量,已遠遠超過伺服器的負載能力,由此可見,計數器演算法方式限流對於週期比較長的限流,存在很大的弊端。

2、滑動視窗演算法

滑動視窗演算法是將時間週期分為n個小週期,分別記錄每個小週期內訪問次數,並且根據時間滑動刪除過期的小週期。如下圖,假設時間週期為1min,將1min再分為2個小週期,統計每個小週期的訪問數量,則可以看到,第乙個時間週期內,訪問數量為75,第二個時間週期內,訪問數量為100,超過100的訪問則被限流掉了   

由此可見,當滑動視窗的格仔劃分的越多,那麼滑動視窗的滾動就越平滑,限流的統計就會越精確。此演算法可以很好的解決固定視窗演算法的臨界問題。

3、漏桶演算法

漏桶演算法是訪問請求到達時直接放入漏桶,如當前容量已達到上限(限流值),則進行丟棄(觸發限流策略)。漏桶以固定的速率進行釋放訪問請求(即請求通過),直到漏桶為空。

4、令牌桶演算法

令牌桶演算法是程式以r(r=時間週期/限流值)的速度向令牌桶中增加令牌,直到令牌桶滿,請求到達時向令牌桶請求令牌,如獲取到令牌則通過請求,否則觸發限流策略。

各個演算法比較

Map 的4種遍歷方式及比較

keyset 第一種方式 keyset 其實遍歷了兩次,第一次獲取iterator,第二次根據key獲取value,因此效能較差。public void testketset mapmap entryset 第二種方式 entryset 優於keyset,因為一次就把key和value放入了entr...

7種排序演算法的介紹(常用)

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...

7種排序演算法的介紹(常用)

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...