自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于Redis實(shí)現(xiàn)一個(gè)簡(jiǎn)單的固定窗口限流器

開(kāi)發(fā) 前端
我們基于在登錄流程中使用的用戶(hù)名進(jìn)行速率限制。如果是基于其他指標(biāo)進(jìn)行限流(例如傳入請(qǐng)求的遠(yuǎn)程IP地址),那么該限流器是不起作用的。

大家好,我是漁夫子。

限流器是在大流量中保護(hù)服務(wù)資源的一種常用手段。限流器的實(shí)現(xiàn)有令牌桶方式、固定窗口限流器和滑動(dòng)窗口限流器。本文介紹了基于Redis如何快速的實(shí)現(xiàn)固定窗口限流器。

最近在我們的項(xiàng)目中需要快速的實(shí)現(xiàn)一個(gè)流量限流器,而目前項(xiàng)目中已經(jīng)有在用Redis了。

固定窗口限流器:它是在固定的時(shí)間窗口(例如一分鐘)內(nèi)計(jì)算接收到的請(qǐng)求數(shù)量。一旦達(dá)到最大請(qǐng)求數(shù)量,額外的請(qǐng)求將被拒絕,直到下一個(gè)窗口開(kāi)始。

要基于Redis實(shí)現(xiàn)固定窗口限流器非常簡(jiǎn)單,如下lua代碼:

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

每次運(yùn)行這個(gè)腳本時(shí),它都會(huì)獲取一個(gè)鍵并將其值遞增1。如果是第一次遞增該鍵時(shí),都會(huì)設(shè)置一個(gè)60秒的過(guò)期時(shí)間。它返回遞增后的當(dāng)前值。

該鍵在首次設(shè)置60秒后過(guò)期。一旦過(guò)期,它將在下一個(gè)請(qǐng)求時(shí)再次設(shè)置。

當(dāng)服務(wù)收到一個(gè)請(qǐng)求時(shí),就可以調(diào)用該段代碼。如果腳本返回的值大于允許的值,則由于速率限制而中止該請(qǐng)求。如果返回的值不大于允許的值,則處理該請(qǐng)求。

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函數(shù)可以按如下方式使用:

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
 }

 // ...
}

這樣就可以工作了。

請(qǐng)注意,固定窗口限流器雖然可以有效抵御持續(xù)攻擊,但可能會(huì)影響合法用戶(hù)的體驗(yàn)。

在上面的示例中,我們基于在登錄流程中使用的用戶(hù)名進(jìn)行速率限制。如果是基于其他指標(biāo)進(jìn)行限流(例如傳入請(qǐng)求的遠(yuǎn)程IP地址),那么該限流器是不起作用的。

責(zé)任編輯:武曉燕 來(lái)源: Go學(xué)堂
相關(guān)推薦

2023-11-09 08:14:07

時(shí)間窗口限流

2023-08-21 08:01:03

2024-02-28 09:22:03

限流算法數(shù)量

2016-11-08 18:53:08

編譯器

2020-08-13 08:43:24

TCP固定窗口滑動(dòng)窗口

2022-05-16 10:45:22

Redis接口限流緩存

2020-06-04 12:55:44

PyTorch分類(lèi)器神經(jīng)網(wǎng)絡(luò)

2020-09-18 10:12:24

KotlinTCP網(wǎng)絡(luò)協(xié)議

2009-07-07 11:38:54

jsp oracle

2021-11-01 12:25:56

Redis分布式

2009-09-01 16:14:06

C#窗口抖動(dòng)

2018-09-18 10:11:21

前端vue.jsjavascript

2021-07-20 10:30:46

Golanghttp語(yǔ)言

2023-05-16 08:01:26

限流算法滑動(dòng)窗口

2009-07-24 11:29:33

WinForm表單窗體

2023-11-15 07:40:40

2011-07-20 10:02:01

Xcode cocoa 窗口

2022-11-29 17:34:43

虛擬形象系統(tǒng)

2024-05-07 09:02:47

2022-06-02 09:09:27

前端React低代碼編輯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)