1. 程式人生 > 實用技巧 >[Go] redis分散式鎖的go-redis實現

[Go] 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 }