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

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

開發(fā) 前端
我們基于在登錄流程中使用的用戶名進(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è)窗口開始。

要基于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秒的過期時(shí)間。它返回遞增后的當(dāng)前值。

該鍵在首次設(shè)置60秒后過期。一旦過期,它將在下一個(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ì)影響合法用戶的體驗(yàn)。

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

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

2023-11-09 08:14:07

時(shí)間窗口限流

2023-08-21 08:01:03

2025-05-23 10:10:00

限流算法系統(tǒng)Go

2024-02-28 09:22:03

限流算法數(shù)量

2016-11-08 18:53:08

編譯器

2020-06-04 12:55:44

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

2022-05-16 10:45:22

Redis接口限流緩存

2020-08-13 08:43:24

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

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分布式

2018-09-18 10:11:21

前端vue.jsjavascript

2021-07-20 10:30:46

Golanghttp語言

2009-09-01 16:14:06

C#窗口抖動(dòng)

2023-11-15 07:40:40

2025-05-27 03:33:00

Spring高并發(fā)接口

2009-07-24 11:29:33

WinForm表單窗體

2023-05-16 08:01:26

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

2022-11-29 17:34:43

虛擬形象系統(tǒng)

2024-05-07 09:02:47

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 欧美中文在线 | 欧美日韩视频在线 | 91高清视频在线观看 | 欧美在线一区二区三区 | 欧美黄色片 | 欧美a在线 | 日韩久久久久 | 天堂免费看片 | 日本在线小视频 | 黑人精品欧美一区二区蜜桃 | 久久亚洲一区二区三区四区 | 一区二区三区精品视频 | 久久婷婷麻豆国产91天堂 | 成人av影院 | www.久久精品 | 亚洲一区二区三区四区在线观看 | 亚洲a网 | 国产精品久久久久一区二区三区 | 成人免费小视频 | 国产激情综合五月久久 | 综合久久综合久久 | 在线观看中文字幕 | 狠狠综合久久av一区二区小说 | 青青久草 | www.xxxx欧美| 国产亚洲网站 | 精品少妇一区二区三区日产乱码 | 成人国产精品久久 | 毛片大全| 一区二区不卡视频 | 国产精品久久一区二区三区 | 欧美一区二区三区在线观看视频 | 在线啊v| 91免费在线 | 免费观看一级特黄欧美大片 | 毛片免费观看 | 伊人爽 | 亚洲精品乱码久久久久久按摩观 | 欧美色偷拍 | 成人在线视频网站 | 少妇一级淫片免费播放 |