在實際開發中,限流(Rate Limiting)是一種保護服務、避免接口被惡意刷流的常見技術。常用的限流算法有令牌桶、漏桶、固定窗口、滑動窗口等。由于Redis具備高性能和原子性操作,常常被用來實現分布式限流。
下面給出使用Golang結合Redis實現簡單限流的幾種常見方式(以“固定窗口計數”和“滑動窗口”為例)。使用的Go Redis庫為go-redis。
1. 固定窗口計數(Fixed Window Counter)
在單位時間窗口(如1秒、1分鐘)內計數,超過閾值則限流。
偽代碼思路:
- 用Redis的
INCR
自增某個key記錄當前窗口內的訪問次數。 - 使用
EXPIRE
設置Key過期時間為窗口大小。 - 如果計數超過閾值,說明被限流。
Go代碼示例:
package mainimport ("context""fmt""github.com/redis/go-redis/v9""time"
)var ctx = context.Background()func FixedWindowRateLimit(client *redis.Client, key string, limit int, window time.Duration) (bool, error) {// 每次請求自增計數cnt, err := client.Incr(ctx, key).Result()if err != nil {