redis分布式鎖的go-redis實(shí)現(xiàn)方法詳解
在分布式的業(yè)務(wù)中 , 如果有的共享資源需要安全的被訪問和處理 , 那就需要分布式鎖
分布式鎖的幾個(gè)原則;
1.「鎖的互斥性」:在分布式集群應(yīng)用中,共享資源的鎖在同一時(shí)間只能被一個(gè)對(duì)象獲取。
2. 「可重入」:為了避免死鎖,這把鎖是可以重入的,并且可以設(shè)置超時(shí)。
3. 「高效的加鎖和解鎖」:能夠高效的加鎖和解鎖,獲取鎖和釋放鎖的性能也好。
4. 「阻塞、公平」:可以根據(jù)業(yè)務(wù)的需要,考慮是使用阻塞、還是非阻塞,公平還是非公平的鎖。
redis實(shí)現(xiàn)分布式鎖主要靠setnx命令
1. 當(dāng)key存在時(shí)失敗 , 保證互斥性
2.設(shè)置了超時(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
}
到此這篇關(guān)于redis分布式鎖的go-redis實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)redis分布式鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Redis過期事件實(shí)現(xiàn)訂單超時(shí)取消
這篇文章主要介紹了基于Redis過期事件實(shí)現(xiàn)訂單超時(shí)取消,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
redis 限制內(nèi)存使用大小的實(shí)現(xiàn)
這篇文章主要介紹了redis 限制內(nèi)存使用大小的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
基于Redis的List實(shí)現(xiàn)特價(jià)商品列表功能
本文通過場景分析給大家介紹了基于Redis的List實(shí)現(xiàn)特價(jià)商品列表,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08
通過prometheus監(jiān)控redis實(shí)時(shí)運(yùn)行狀態(tài)的操作方法
本文詳細(xì)介紹了如何通過Prometheus監(jiān)控Redis的運(yùn)行狀態(tài),包括安裝配置Redis、Redis Exporter以及Prometheus,配置Prometheus監(jiān)控Redis指標(biāo),以及常見的Redis指標(biāo)和告警規(guī)則,需要的朋友可以參考下2025-02-02

