go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版)
之前給大家介紹過單機(jī)當(dāng)前進(jìn)程的滑動(dòng)窗口限流 , 這一個(gè)是使用go redis list結(jié)構(gòu)實(shí)現(xiàn)的滑動(dòng)窗口限流 , 原理都一樣 , 但是支持分布式
原理可以參考之前的文章介紹
func LimitFreqs(queueName string, count uint, timeWindow int64) bool { currTime := time.Now().Unix() length := uint(ListLen(queueName)) if length < count { ListPush(queueName, currTime) return true } //隊(duì)列滿了,取出最早訪問的時(shí)間 earlyTime, _ := strconv.ParseInt(ListIndex(queueName, int64(length)-1), 10, 64) //說明最早期的時(shí)間還在時(shí)間窗口內(nèi),還沒過期,所以不允許通過 if currTime-earlyTime <= timeWindow { return false } else { //說明最早期的訪問應(yīng)該過期了,去掉最早期的 ListPop(queueName) ListPush(queueName, currTime) } return true }
開源作品
開源GO語言在線WEB客服即時(shí)通訊管理系統(tǒng)GO-FLY
github地址:go-fly
在線測(cè)試地址:https://gofly.sopans.com
附錄:下面看下redis分布式鎖的go-redis實(shí)現(xiàn)
在分布式的業(yè)務(wù)中 , 如果有的共享資源需要安全的被訪問和處理 , 那就需要分布式鎖
分布式鎖的幾個(gè)原則;
1.「鎖的互斥性」:在分布式集群應(yīng)用中,共享資源的鎖在同一時(shí)間只能被一個(gè)對(duì)象獲取。
2. 「可重入」:為了避免死鎖,這把鎖是可以重入的,并且可以設(shè)置超時(shí)。
3. 「高效的加鎖和解鎖」:能夠高效的加鎖和解鎖,獲取鎖和釋放鎖的性能也好。
4. 「阻塞、公平」:可以根據(jù)業(yè)務(wù)的需要,考慮是使用阻塞、還是非阻塞,公平還是非公平的鎖。
redis實(shí)現(xiàn)分布式鎖主要靠setnx命令
1. 當(dāng)key存在時(shí)失敗 , 保證互斥性
2.設(shè)置了超時(shí) , 避免死鎖
3.利用mutex保證當(dāng)前程序不存在并發(fā)沖突問題
package redis import ( "context" "github.com/go-redis/redis/v8" "github.com/taoshihan1991/miaosha/setting" "log" "sync" "time" ) var rdb *redis.Client var ctx = context.Background() var mutex sync.Mutex func NewRedis() { rdb = redis.NewClient(&redis.Options{ Addr: setting.Redis.Ip + ":" + setting.Redis.Port, Password: "", // no password set DB: 0, // use default DB }) } func Lock(key string) bool { mutex.Lock() defer mutex.Unlock() bool, err := rdb.SetNX(ctx, key, 1, 10*time.Second).Result() if err != nil { log.Println(err.Error()) } return bool } func UnLock(key string) int64 { nums, err := rdb.Del(ctx, key).Result() if err != nil { log.Println(err.Error()) return 0 } return nums }
開源作品
開源GO語言在線WEB客服即時(shí)通訊管理系統(tǒng)GO-FLY
github地址:go-fly
在線測(cè)試地址:https://gofly.sopans.com
到此這篇關(guān)于go redis實(shí)現(xiàn)滑動(dòng)窗口限流-redis版的文章就介紹到這了,更多相關(guān)go redis滑動(dòng)窗口限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解go 動(dòng)態(tài)數(shù)組 二維動(dòng)態(tài)數(shù)組
這篇文章主要介紹了go 動(dòng)態(tài)數(shù)組 二維動(dòng)態(tài)數(shù)組,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Go json omitempty如何實(shí)現(xiàn)可選屬性
在Go語言中,使用`omitempty`可以幫助我們?cè)谶M(jìn)行JSON序列化和反序列化時(shí),忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來實(shí)現(xiàn)這一功能,例如,將float32修改為*float322024-09-09GoLang中生成UUID唯一標(biāo)識(shí)的實(shí)現(xiàn)方法
UUID是讓分散式系統(tǒng)中的所有元素,都能有唯一的辨識(shí)信息,本文主要介紹了GoLang中生成UUID唯一標(biāo)識(shí)的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08