成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Redis實現一個簡單的固定窗口限流器

開發 前端
我們基于在登錄流程中使用的用戶名進行速率限制。如果是基于其他指標進行限流(例如傳入請求的遠程IP地址),那么該限流器是不起作用的。

大家好,我是漁夫子。

限流器是在大流量中保護服務資源的一種常用手段。限流器的實現有令牌桶方式、固定窗口限流器和滑動窗口限流器。本文介紹了基于Redis如何快速的實現固定窗口限流器。

最近在我們的項目中需要快速的實現一個流量限流器,而目前項目中已經有在用Redis了。

固定窗口限流器:它是在固定的時間窗口(例如一分鐘)內計算接收到的請求數量。一旦達到最大請求數量,額外的請求將被拒絕,直到下一個窗口開始。

要基于Redis實現固定窗口限流器非常簡單,如下lua代碼:

local current
current = redis.call("INCR", KEYS[1])
if tonumber(current) == 1 then
 redis.call("EXPIRE", KEYS[1], 60)
end
return current

每次運行這個腳本時,它都會獲取一個鍵并將其值遞增1。如果是第一次遞增該鍵時,都會設置一個60秒的過期時間。它返回遞增后的當前值。

該鍵在首次設置60秒后過期。一旦過期,它將在下一個請求時再次設置。

當服務收到一個請求時,就可以調用該段代碼。如果腳本返回的值大于允許的值,則由于速率限制而中止該請求。如果返回的值不大于允許的值,則處理該請求。

const script = `
local current
current = redis.call("INCR", KEYS[1])
if tonumber(current) == 1 then
 redis.call("EXPIRE", KEYS[1], 60)
end
return current
`

func isRateLimited(ctx context.Context, key string, limit int64) (bool, error) { 
 v, err := redisClient.Eval(ctx, script, []string{key}).Result()
 if err != nil {
  return false, err
 }
 n, _ := v.(int64)
 return n > int64(limit), nil
}

isRateLimited函數可以按如下方式使用:

func handleLogin(r *http.Request, w http.ResponseWriter) {
 username := r.FormValue("username")

 limited, _ := isRateLimited(context.TODO(), fmt.Sprintf("rateLimit:login:username:%s", username, 5))
 if limited {
  http.Error(w, "Too Many Attempts", http.StatusTooManyRequests)
  return
 }

 // ...
}

這樣就可以工作了。

請注意,固定窗口限流器雖然可以有效抵御持續攻擊,但可能會影響合法用戶的體驗。

在上面的示例中,我們基于在登錄流程中使用的用戶名進行速率限制。如果是基于其他指標進行限流(例如傳入請求的遠程IP地址),那么該限流器是不起作用的。

責任編輯:武曉燕 來源: Go學堂
相關推薦

2023-11-09 08:14:07

時間窗口限流

2023-08-21 08:01:03

2025-05-23 10:10:00

限流算法系統Go

2024-02-28 09:22:03

限流算法數量

2016-11-08 18:53:08

編譯器

2020-06-04 12:55:44

PyTorch分類器神經網絡

2022-05-16 10:45:22

Redis接口限流緩存

2020-08-13 08:43:24

TCP固定窗口滑動窗口

2020-09-18 10:12:24

KotlinTCP網絡協議

2009-07-07 11:38:54

jsp oracle

2021-11-01 12:25:56

Redis分布式

2021-07-20 10:30:46

Golanghttp語言

2018-09-18 10:11:21

前端vue.jsjavascript

2009-09-01 16:14:06

C#窗口抖動

2023-11-15 07:40:40

2025-05-27 03:33:00

Spring高并發接口

2009-07-24 11:29:33

WinForm表單窗體

2023-05-16 08:01:26

限流算法滑動窗口

2022-11-29 17:34:43

虛擬形象系統

2024-05-07 09:02:47

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线免费电影 | 91精品一区 | 中文二区| 日本高清视频在线播放 | 欧美簧片| 亚洲小视频在线观看 | 99久久电影 | 狠狠插狠狠操 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 亚洲国产欧美在线 | www97影院| 久久av在线播放 | 成人综合视频在线观看 | 欧美精选一区二区 | 日韩中文字幕一区二区 | 亚洲国产欧美日韩 | 成人不卡 | 青青99 | 久久国产精品99久久久久久丝袜 | 国产精品久久久久久久久久妇女 | 免费毛片网 | 精品国产91乱码一区二区三区 | 久久91精品 | 亚洲精品在线免费观看视频 | 精品成人佐山爱一区二区 | 免费特级黄毛片 | 黄色一级片在线播放 | 日韩在线不卡视频 | 白浆在线 | 99精品视频一区二区三区 | 久久欧美精品 | 狠狠色综合久久婷婷 | 毛片久久久 | 成人毛片在线视频 | 成年人网站免费 | 天天操夜夜操 | 日日夜夜视频 | 91国内精品久久 | 狠狠影院 | 亚洲三区在线观看 | 亚洲免费视频在线观看 |