這篇文章給大家介紹redis數(shù)據(jù)庫怎么利用go-redis實(shí)現(xiàn)一個分布式鎖,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了聊城免費(fèi)建站歡迎大家使用!分布式鎖的幾個原則;
1.「鎖的互斥性」:在分布式集群應(yīng)用中,共享資源的鎖在同一時間只能被一個對象獲取。
2. 「可重入」:為了避免死鎖,這把鎖是可以重入的,并且可以設(shè)置超時。
3. 「高效的加鎖和解鎖」:能夠高效的加鎖和解鎖,獲取鎖和釋放鎖的性能也好。
4. 「阻塞、公平」:可以根據(jù)業(yè)務(wù)的需要,考慮是使用阻塞、還是非阻塞,公平還是非公平的鎖。
redis實(shí)現(xiàn)分布式鎖主要靠setnx命令
1. 當(dāng)key存在時失敗 , 保證互斥性
2.設(shè)置了超時 , 避免死鎖
3.利用mutex保證當(dāng)前程序不存在并發(fā)沖突問題
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 }