1. 程式人生 > 資料庫 >go redis實現滑動視窗限流的方式(redis版)

go redis實現滑動視窗限流的方式(redis版)

之前給大家介紹過單機當前程序的滑動視窗限流,這一個是使用go redis list結構實現的滑動視窗限流,原理都一樣,但是支援分散式

原理可以參考之前的文章介紹

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
 }
 //佇列滿了,取出最早訪問的時間
 earlyTime,_ := strconv.ParseInt(ListIndex(queueName,int64(length)-1),10,64)
 //說明最早期的時間還在時間視窗內,還沒過期,所以不允許通過
 if currTime-earlyTime <= timeWindow {
  return false
 } else {
  //說明最早期的訪問應該過期了,去掉最早期的
  ListPop(queueName)
  ListPush(queueName,currTime)
 }
 return true
}

開源作品

開源GO語言線上WEB客服即時通訊管理系統GO-FLY

github地址:go-fly

線上測試地址:https://gofly.sopans.com

附錄:下面看下redis分散式鎖的go-redis實現

在分散式的業務中,如果有的共享資源需要安全的被訪問和處理,那就需要分散式鎖

分散式鎖的幾個原則;

1.「鎖的互斥性」:在分散式叢集應用中,共享資源的鎖在同一時間只能被一個物件獲取。

2. 「可重入」:為了避免死鎖,這把鎖是可以重入的,並且可以設定超時。

3. 「高效的加鎖和解鎖」:能夠高效的加鎖和解鎖,獲取鎖和釋放鎖的效能也好。

4. 「阻塞、公平」:可以根據業務的需要,考慮是使用阻塞、還是非阻塞,公平還是非公平的鎖。

redis實現分散式鎖主要靠setnx命令

1. 當key存在時失敗,保證互斥性

2.設定了超時,避免死鎖

3.利用mutex保證當前程式不存在併發衝突問題

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客服即時通訊管理系統GO-FLY

github地址:go-fly

線上測試地址:https://gofly.sopans.com

到此這篇關於go redis實現滑動視窗限流-redis版的文章就介紹到這了,更多相關go redis滑動視窗限流內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!