頻控實現原理

2021-10-05 03:38:44 字數 831 閱讀 7450

頻控:通過限制單位時間內可訪問的次數,達到限流的目的。利用頻控,可以用來限制訪問某些服務介面的流量,防止伺服器由於承受太大的訪問量而崩潰。

頻控都會指定乙個特徵,比如:來自同乙個使用者的請求、來自同乙個ip的請求等。實際應用場景中為防止服務過載,經常會有比如:每個使用者在1分鐘之內只能請求10次,每個ip在1小時之內只能請求30次等等這樣的頻控限制。一般都利用快取比如redis來實現頻控。

比如限制每個使用者(用$uid表示)在1分鐘之內只允許有30次請求,那麼我們首先想到redis的實現方式是:

//第一步:以$uid為key,從0開始每次請求累加1進行計數

$count = redis->incr($uid);

//第二步:如果是第1次請求,那麼設定該key的過期時間為60秒

if($count === 1)

//第三步:判斷當前請求是否已超過該key所限制的30次

if($count > 30)

乍一看沒什麼問題,但如果在第二步時設定過期時間失敗了,那麼將導致乙個週期(1分鐘)之後,計數器不會被重置清零,而是一直累加,這樣頻控將是一直超限的。

為了確保在週期內,第1次累加和設定過期時間在乙個事務中,可以利用set方法。從redis 2.6.12 開始,set方法支援引數ex、px、nx、xx。

//第一步:如果是第1次,設定過期時間後則會返回"ok",否則返回nil

$ret = redis->set($uid,1,array('ex'=>60,'nx'));

//第二步:如果不成功,說明本週期還未結束,計數累加

if(!$ret)

}

設計 基於redis的簡單頻控實現

場景 時間內只能yyy次 在redis裡維護乙個數字型別的k v,key的生成策略與頻控的維度有關,比如是使用者級的頻控,那麼key就是乙個userid 如果是總頻控,那麼key就是乙個string常量。key的過期時間就是頻控的時間間隔,在建立key的時候設定過期時間。過頻控時,需要將key的計數...

關於雙控陣列的實現原理的討論

對於乙個支援fc san的雙控儲存陣列,對外號稱active active,實現記憶體映象 乙個lun通過兩個路徑連線到伺服器,伺服器用多路徑軟體訪問這個lun,如下圖 1 雙控中乙個宕機後,伺服器的多路徑軟體會檢測到有一條路徑不通,會自動把io轉到另外乙個路徑上,保證任務不中斷,請問這個功能和雙控...

流控神器 Sentinel 工作原理

sentinel 是面向分布式服務架構的輕量級流量控制框架,主要以流量為切入點,從流量控制 熔斷降級 系統負載保護等多個維度來幫助您保護服務的穩定性。1.sentinel資源 規則 我們說的資源,可以是任何東西,服務,服務裡的方法,甚至是一段 使用 sentinel 來進行資源保護,主要分為兩個步驟...