go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版)
之前給大家介紹過(guò)單機(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ì)列滿(mǎn)了,取出最早訪問(wèn)的時(shí)間
earlyTime, _ := strconv.ParseInt(ListIndex(queueName, int64(length)-1), 10, 64)
//說(shuō)明最早期的時(shí)間還在時(shí)間窗口內(nèi),還沒(méi)過(guò)期,所以不允許通過(guò)
if currTime-earlyTime <= timeWindow {
return false
} else {
//說(shuō)明最早期的訪問(wèn)應(yīng)該過(guò)期了,去掉最早期的
ListPop(queueName)
ListPush(queueName, currTime)
}
return true
}
開(kāi)源作品
開(kāi)源GO語(yǔ)言在線WEB客服即時(shí)通訊管理系統(tǒng)GO-FLY
github地址:go-fly
在線測(cè)試地址:https://gofly.sopans.com
附錄:下面看下redis分布式鎖的go-redis實(shí)現(xiàn)
在分布式的業(yè)務(wù)中 , 如果有的共享資源需要安全的被訪問(wèn)和處理 , 那就需要分布式鎖
分布式鎖的幾個(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ā)沖突問(wèn)題
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
}
開(kāi)源作品
開(kāi)源GO語(yǔ)言在線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語(yǔ)言中的復(fù)合類(lèi)型詳細(xì)介紹
這篇文章主要介紹了Go語(yǔ)言中的復(fù)合類(lèi)型詳細(xì)介紹,復(fù)合類(lèi)型包括:結(jié)構(gòu)體、數(shù)組、切片、Maps,需要的朋友可以參考下2014-10-10
golang?db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn)
這篇文章主要介紹了golang db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
從并發(fā)到并行解析Go語(yǔ)言中的sync.WaitGroup
Go?語(yǔ)言提供了許多工具和機(jī)制來(lái)實(shí)現(xiàn)并發(fā)編程,其中之一就是?sync.WaitGroup。本文就來(lái)深入討論?sync.WaitGroup,探索其工作原理和在實(shí)際應(yīng)用中的使用方法吧2023-05-05
Go內(nèi)存分配之結(jié)構(gòu)體優(yōu)化技巧
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言?xún)?nèi)存分配之結(jié)構(gòu)體優(yōu)化技巧的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門(mén)
這篇文章主要為大家介紹了go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門(mén)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Go創(chuàng)建Grpc鏈接池實(shí)現(xiàn)過(guò)程詳解
這篇文章主要為大家介紹了Go創(chuàng)建Grpc鏈接池實(shí)現(xiàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Golang定時(shí)器Timer與Ticker的使用詳解
在 Go 里有很多種定時(shí)器的使用方法,像常規(guī)的 Timer、Ticker 對(duì)象,本文主要為大家介紹了Timer與Ticker的使用,感興趣的小伙伴可以了解一下2023-05-05

