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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM