1. 程式人生 > 資料庫 >redis分散式鎖的go-redis實現方法詳解

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
}

到此這篇關於redis分散式鎖的go-redis實現方法的文章就介紹到這了,更多相關redis分散式鎖內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!