redis 基於 漏斗演算法 實現對 api 的限流

2021-10-14 13:10:50 字數 1607 閱讀 5743

漏桶有一定的容量,給漏桶注水,當單位時間內注入水量大於流出水量,漏桶內積累的水就會越來越多,直到溢位。

就好比大批量請求訪問nginx相當於注水,nginx根據配置按照固定速率處理請求當做排水。

漏桶容量就好比配置給nginx的佇列長度。當漏桶發生溢位,則禁止請求進入,直接返回錯誤

* [leaky php實現漏桶演算法]

* @param [type] $contain [int 桶的總容量]

* @param [type] $addnum [int 每次注入桶中的水量]

* @param [type] $leakrate [int 桶中漏水的速率,秒為單位。例如2/s,3/s]

* @param integer &$water [int 當前水量]

* @param integer &$pretime [int 時間戳,記錄的上次漏水時間]

* @return [type] [bool,返回可否繼續注入true/false]

*/function leaky($contain,$addnum,$leakrate,&$water=0,&$pretime=0)

else }

/*** 測試

* @var integer

*/for($i=0;$i<500;$i++)

public function speedcounter()  else 

} else

} } else

漏桶演算法

漏桶的大小是固定的,處理速度也是固定的,但是請求的速率的不固定的。在突發的情況下,會丟棄很多請求。

/*** **漏桶的大小是固定的,處理速度也是固定的,但是請求的速率的不固定的。在突發的情況下,會丟棄很多請求。**

*/function leackbucket() else

} else

}

令牌桶

令牌桶演算法(token bucket)和 leaky bucket 效果一樣但方向相反的演算法,更加容易理解.隨著時間流逝,系統會按恆定1/qps時間間隔(如果qps=100,則間隔是10ms)往桶裡加入token(想象和漏洞漏水相反,有個水龍頭在不斷的加水),如果桶已經滿了就不再加了.新請求來臨時,會各自拿走乙個token,如果沒有token可拿了就阻塞或者拒絕服務.

令牌桶的另外乙個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種演算法則實時的計算應該增加的令牌的數量.

/**

* 令牌

*/function trafficshaper() else

}

基於Redis實現的單點登入

背景 每個web應用都有自己的session,那如何在分布式或者集群環境下統一session,即如何實現單點登入,如下圖 解決方案 把session資料存放在redis,統一管理,向外提供服務介面,redis可以設定過期時間,對應session的失效時間 優點 訪問速度快,效率高 無單點故障,可以部...

spring基於redis實現訊息訂閱

本文主要記錄一下如何使用spring基於redis提供的pub sub模型來實現訊息的發布和訂閱處理,只記錄幾個需要注意的切入點.org.springframework.bootgroupid spring boot starter data redisartifactid 2.1.6.releas...

基於sklearn實現Bagging演算法(pyth

圖中a,b,c,d,e,f列表示六個特徵,g表示樣本標籤。每一行資料即為乙個樣本的六個特徵和標籤。實現bagging演算法的 如下 from sklearn.ensemble import baggingclassifier from sklearn.tree import decisiontree...