Golang的滑動視窗計數器Redis限速實現
這是一個基於Figma 工程團隊的部落格文章構建的簡單速率限制器。
有關實際演算法的要求和設計的資訊,請參閱帖子。
限速器滿足這個介面:
type Limiter interface { Increment (context. Context , string , int ) error } |
該實現由 Redis 支援並使用 go-redis 庫。
client := goredis.NewClient(&goredis.Options{ Addr: "localhost:6379", }) ratelimiter := redis.New(client, 10, time.Minute, time.Hour) ratelimiter.Increment(ctx, "user_id", 1) |
為方便起見,還有一個 http 中介軟體。靈感來自 Seth Vargo 的速率限制庫:
ratelimiter := redis.New(client, 10, time.Minute, time.Hour) mw := ratelimit.Middleware(ratelimiter, ratelimit.IPKeyFunc, 1) // use mw in your favourite HTTP library |
Middleware函式有一個weight引數,它允許您為某些路由提供更高的增量權重。例如,您的基本速率限制可以是每小時 1000 個請求,每個請求的權重為 1,但計算量特別大的端點可能希望權重為 10,因此每個請求將內部計數器增加 10 而不是 1 .
如果您使用多箇中介軟體例項,請確保不要向全域性多路複用器/路由器新增一個,否則您的請求將觸發兩個速率限制計算(因此,Redis 網路 I/O 操作)。這可以在未來透過集中式中介軟體控制器來解決,該控制器提供具有優先順序規則順序等的限制器樹。
原始碼檢視 Github
相關文章
- 滑動視窗最大值的golang實現Golang
- [分散式限流] 滑動視窗演算法的 Golang 實現分散式演算法Golang
- 使用 Redis 實現限流——滑動視窗演算法Redis演算法
- 自己實現一個滑動視窗
- Hive實戰—時間滑動視窗計算Hive
- 演算法~利用zset實現滑動視窗限流演算法
- mysql視窗函式中的滑動視窗MySql函式
- Flink的滾動視窗、會話視窗、滑動視窗及其應用會話
- 透過滑動視窗實現介面呼叫的多種限制策略
- Sentinel 原理-滑動視窗
- 滑動視窗專題
- 細聊滑動視窗
- 滑動視窗的最大值
- 滑動視窗濾波器原理分析及詳細程式碼講解實現
- 滑動視窗演算法演算法
- Leetcode 最小調整數+滑動視窗遞增子序列LeetCode
- 原始碼分析 Alibaba sentinel 滑動視窗實現原理(文末附原理圖)原始碼
- 滑動視窗問題總結
- 滑動視窗與雙指標指標
- 滑動視窗法——Leetcode例題LeetCode
- 滑動視窗演算法思路演算法
- TCP 流量控制-滑動視窗TCP
- WeetCode2滑動視窗系列
- Sentinel滑動視窗演算法演算法
- Sentinel Go 核心統計結構滑動視窗的深度解析Go
- 滑動視窗的最大值問題
- TCP的滑動視窗和擁塞控制TCP
- 使用golang實現redis伺服器GolangRedis伺服器
- 滑動視窗(Sliding Window)技巧總結
- 「LeetCode Top100」之滑動視窗LeetCode
- 239. 滑動視窗最大值
- 滑動視窗最大值問題
- 力扣刷題-滑動視窗(字串)力扣字串
- 計數排序 -- GoLang實現排序Golang
- JZ-064-滑動視窗的最大值
- 滑動視窗相關的題目總結
- Leetcode 239. 滑動視窗最大值 (Java實現 超詳細註釋!)LeetCodeJava
- Sentinel-Go 原始碼系列(三)滑動時間視窗演算法的工程實現Go原始碼演算法