校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Go 語言下基于Redis分布式鎖的實現(xiàn)方式

Go 語言下基于Redis分布式鎖的實現(xiàn)方式

熱門標(biāo)簽:400手機電話免費辦理 上海企業(yè)外呼系統(tǒng)排名 武漢百應(yīng)人工智能電銷機器人 百度地圖標(biāo)注位置網(wǎng)站 開通400電話申請流程 電腦外呼系統(tǒng)輻射大嗎 智能語音電銷的機器人 揚州電銷外呼系統(tǒng)軟件 如何利用高德地圖標(biāo)注家

分布式鎖一般有三種實現(xiàn)方式:1. 數(shù)據(jù)庫樂觀鎖;2. 基于Redis的分布式鎖;3. 基于ZooKeeper的分布式鎖。本篇博客將介紹第二種方式,基于Redis實現(xiàn)分布式鎖。雖然網(wǎng)上已經(jīng)有各種介紹Redis分布式鎖實現(xiàn)的博客,然而他們的實現(xiàn)卻有著各種各樣的問題,為了避免誤人子弟,本篇博客將詳細(xì)介紹如何正確地實現(xiàn)Redis分布式鎖。

項目地址: https://github.com/Spongecaptain/redisLock

1. Go 原生的互斥鎖

Go 原生的互斥鎖即 sync 包下的 Mutex 結(jié)構(gòu)體,利用此結(jié)構(gòu)體的 Lock 以及 Unlock 方法能夠?qū)崿F(xiàn)鎖的占據(jù)以及釋放。

關(guān)于 sync.Mutex,我們可以總結(jié)出如下的特性:

  • 支持自旋鎖,在并發(fā)沖突不嚴(yán)重的背景下提高鎖的使用效率;
  • 支持鎖的公平性,能夠避免鎖導(dǎo)致的線程饑餓問題;
  • 不支持鎖的重入,持有鎖的協(xié)程再次申請鎖資源會導(dǎo)致死鎖;
  • 任何協(xié)程都可以調(diào)用 Mutex.Unlock 方法來解鎖,并不只允許占據(jù)鎖資源的協(xié)程進(jìn)行解鎖;
  • 不支持超時鎖獲取,也不支持 TryLock 機制

Go 語言中 sync.Mutex 的特性與 Java 中 java.util.concurrent.locks.Lock 相比,API 語義簡單不少,這也符合 Go 語言對于簡單化的追求。

下面看看本項目-基于 Redis 的分布式鎖能夠提供哪些分布鎖特性。

2. redisLock 的特性

github-redisLock 是一個基于 go-redis/redis 客戶端的 Redis 分布式鎖。其擁有的如下的特性:

  • 原子性:利用 Lua 腳本實現(xiàn)原子性語義;
  • 阻塞喚醒:利用 Redis 的發(fā)布訂閱來實現(xiàn)鎖的阻塞喚醒;
  • 鎖自動過期:避免因為宕機導(dǎo)致的死鎖問題;
  • 鎖的自動續(xù)期:利用 Go 協(xié)程實現(xiàn)鎖資源的自動續(xù)期,避免出現(xiàn)業(yè)務(wù)時間>鎖超時時間導(dǎo)致并發(fā)安全問題
  • TryLock:嘗試獲取一次鎖,獲取失敗后阻塞
  • 自旋鎖:提供自旋鎖 API 來實現(xiàn)分布式鎖的自旋獲取

github-redisLock 同時不支持如下特性:

重入性:分布式鎖不可重入,Go 語言并沒有優(yōu)雅的方式來實現(xiàn) Java 中的 ThreadLocal 機制
非公平性:分布式鎖存在非公平問題,在極端情況下會導(dǎo)致饑餓問題

3. Quick Start

Install redisLock:

go get github.com/Spongecaptain/redisLock


 

Create redis client:

import(
 "github.com/go-redis/redis"
)
var redisClient = redis.NewClient(redis.Options{
 Addr:     "localhost:6379",
 Password: "", // no password set
 DB:       0,  // use default DB
})

Create redisLock:

key := "reids-lock-key"
value := "redis-lock-value"
lock := redisLock.NewRedisLock(redisClient, key, value)

err := lock.Lock()
if err != nil {
  fmt.Println(err.Error())
  return
}
fmt.Println("get redis lock success")
defer func() {
  err = lock.Unlock()
  if err != nil {
    fmt.Println(err.Error())
    return
  }
  fmt.Println("release redis lock success")
}()

4. API 說明

(1)構(gòu)造分布式鎖實例
利用 NewRedisLock 以及 NewRedisLockWithExpireTime 函數(shù)能夠構(gòu)造出一個分布式鎖實例,NewRedisLockWithExpireTime 的區(qū)別在于其能夠自定義鎖的過期時間。

NewRedisLock 方法接收的 key 決定了分布式鎖的粒度,value 決定了只有 value 值相同才能夠進(jìn)行解鎖。

(2)TryLock
TryLock 僅嘗試一次鎖的獲取,如果失敗,那么不會阻塞,直接返回。

(3)Lock
Lock 會不斷嘗試索取分布式鎖,這會導(dǎo)致調(diào)用此方法的協(xié)程阻塞。

(4)Unlock
Unlock 方法用于解鎖,由于涉及網(wǎng)絡(luò)通信,解鎖可能失敗, error!=nil 意味著解鎖失敗。

(5)LockWithTimeout
Lock 方法會在獲取鎖資源成功或者超時后返回。

(6)SpinLock
支持指定次數(shù)地進(jìn)行自旋式的鎖獲取。

以上就是Go 語言下基于 Redis 的分布式鎖的詳細(xì)內(nèi)容,更多關(guān)于Go 分布式鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • redis分布式鎖的go-redis實現(xiàn)方法詳解
  • 詳解一種用django_cache實現(xiàn)分布式鎖的方式
  • go如何利用orm簡單實現(xiàn)接口分布式鎖
  • mongo分布式鎖Java實現(xiàn)方法(推薦)
  • 淺談Redis分布式鎖的正確實現(xiàn)方式
  • Java使用Redisson分布式鎖實現(xiàn)原理
  • Redis Template實現(xiàn)分布式鎖的實例代碼

標(biāo)簽:新余 江西 黑龍江 武漢 嘉峪關(guān) 宜賓 張掖 延邊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go 語言下基于Redis分布式鎖的實現(xiàn)方式》,本文關(guān)鍵詞  語,言下,基于,Redis,分布式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go 語言下基于Redis分布式鎖的實現(xiàn)方式》相關(guān)的同類信息!
  • 本頁收集關(guān)于Go 語言下基于Redis分布式鎖的實現(xiàn)方式的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 大丰市| 通城县| 朝阳区| 东阿县| 神木县| 兰坪| 防城港市| 枣庄市| 凤台县| 普宁市| 永宁县| 综艺| 黔西| 弥渡县| 长顺县| 博乐市| 红桥区| 辰溪县| 新田县| 东至县| 大洼县| 宜都市| 鸡东县| 临高县| 乃东县| 闸北区| 张家港市| 铁岭县| 五河县| 漳平市| 夏津县| 大竹县| 稻城县| 攀枝花市| 黎平县| 奈曼旗| 高台县| 聂荣县| 南丰县| 大邑县| 常州市|