?簡介:
????????系統要限定用戶的某個行為在指定的時間里只能允許發生 N 次,如何使用 Redis 的數據結構來實現這個限流的功能?
固定窗口
????????比如我們規定我們的一個接口一分鐘只能訪問10次的話。使用固定窗口計數器算法的話可以這樣實現:給定一個變量counter來記錄處理的請求數量,當1分鐘之內處理一個請求之后讓counter+1,1分鐘之內的如果counter=100的話,后續的請求就會被全部拒絕。
? ? ? ? 但固定窗口有一個缺點,速率不一致,無法應對激增的并發請求。比如我們限制一個接口一分鐘只能訪問10次的話,前半分鐘一個請求沒有接收,后半分鐘接收了10個請求。
該窗口利用redis的string即可實現
滑動窗口
? ? ? ? 為了解決上述所說的,流量激增問題,我們需要設計一個滑動窗口。它把時間以一定比例分片。例如我們的借口限流每分鐘處理60個請求,我們可以把 1 分鐘分為60個窗口。每隔1秒移動一次。當滑動窗口的格子劃分的越多,滑動窗口的滾動就越平滑。
? ? ? ? 這一點可以使用redis的zset實現滑動窗口。zset的value存時間戳。
????????實現步驟:1.zadd 指令,存當前請求的次數? 2.zremrangeByScore清除時間窗口以外的請求 3.zcard獲取當前key的請求。
參考:https://zhuanlan.zhihu.com/p/342597134