欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年06月28日 09:19:52   作者:Spongecaptain  
本篇文章將詳細(xì)介紹如何正確地實(shí)現(xiàn)Redis分布式鎖,下面通過(guò)一個(gè)項(xiàng)目基于 Redis 的分布式鎖能夠提供哪些分布鎖特性,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧

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

項(xiàng)目地址: 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)致的線程饑餓問(wèn)題;
  • 不支持鎖的重入,持有鎖的協(xié)程再次申請(qǐng)鎖資源會(huì)導(dǎo)致死鎖;
  • 任何協(xié)程都可以調(diào)用 Mutex.Unlock 方法來(lái)解鎖,并不只允許占據(jù)鎖資源的協(xié)程進(jìn)行解鎖;
  • 不支持超時(shí)鎖獲取,也不支持 TryLock 機(jī)制

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

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

2. redisLock 的特性

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

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

github-redisLock 同時(shí)不支持如下特性:

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

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 說(shuō)明

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

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

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

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

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

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

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

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

相關(guān)文章

  • Go語(yǔ)言處理Excel文件的教程詳解

    Go語(yǔ)言處理Excel文件的教程詳解

    在Go語(yǔ)言中,有許多庫(kù)和工具可用于處理Excel文件,本文將介紹如何使用Go語(yǔ)言處理Excel文件,包括讀取、寫入和修改Excel文件,需要的小伙伴可以了解下
    2024-01-01
  • 詳解Go語(yǔ)言中的內(nèi)存對(duì)齊

    詳解Go語(yǔ)言中的內(nèi)存對(duì)齊

    前面我們學(xué)習(xí)了Go語(yǔ)言空結(jié)構(gòu)體詳解,最近又在看unsafe包的知識(shí),在查閱相關(guān)資料時(shí)不免會(huì)看到內(nèi)存對(duì)齊相關(guān)的內(nèi)容。雖然不會(huì),但可以學(xué)呀,那么這篇文章,我們就一起來(lái)看下什么是內(nèi)存對(duì)齊吧
    2022-10-10
  • golang trace view視圖詳解

    golang trace view視圖詳解

    在golang中可以使用go pprof的工具對(duì)golang程序進(jìn)行性能分析,其中通過(guò)go trace 命令生成的trace view視圖對(duì)于我們分析系統(tǒng)延遲十分有幫助,鑒于當(dāng)前對(duì)trace view視圖的介紹還是很少,在粗略的看過(guò)trace統(tǒng)計(jì)原理后,將對(duì)這部分做比較詳細(xì)的介紹
    2023-08-08
  • golang抓取網(wǎng)頁(yè)并分析頁(yè)面包含的鏈接方法

    golang抓取網(wǎng)頁(yè)并分析頁(yè)面包含的鏈接方法

    今天小編就為大家分享一篇golang抓取網(wǎng)頁(yè)并分析頁(yè)面包含的鏈接方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Go實(shí)現(xiàn)文件上傳和下載

    Go實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了Go實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 一文帶大家了解Go語(yǔ)言中的內(nèi)聯(lián)優(yōu)化

    一文帶大家了解Go語(yǔ)言中的內(nèi)聯(lián)優(yōu)化

    內(nèi)聯(lián)優(yōu)化是一種常見(jiàn)的編譯器優(yōu)化策略,通俗來(lái)講,就是把函數(shù)在它被調(diào)用的地方展開(kāi),這樣可以減少函數(shù)調(diào)用所帶來(lái)的開(kāi)銷,本文主要為大家介紹了Go中內(nèi)聯(lián)優(yōu)化的具體使用,需要的可以參考下
    2023-05-05
  • Go 實(shí)現(xiàn)一次性打包各個(gè)平臺(tái)的可執(zhí)行程序

    Go 實(shí)現(xiàn)一次性打包各個(gè)平臺(tái)的可執(zhí)行程序

    這篇文章主要介紹了Go 實(shí)現(xiàn)一次性打包各個(gè)平臺(tái)的可執(zhí)行程序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 一文帶你了解Go語(yǔ)言中的函數(shù)

    一文帶你了解Go語(yǔ)言中的函數(shù)

    函數(shù)是編程中不可或缺的組成部分,在本文中,我們將詳細(xì)介紹Go語(yǔ)言中函數(shù)的概念和使用方法,包括函數(shù)的定義、參數(shù)和返回值等,需要的可以參考一下
    2023-06-06
  • 在Go中編寫測(cè)試代碼的方法總結(jié)

    在Go中編寫測(cè)試代碼的方法總結(jié)

    在程序開(kāi)發(fā)過(guò)程中,測(cè)試是非常重要的一環(huán),甚至有一種開(kāi)發(fā)模式叫?TDD,先編寫測(cè)試,再編寫功能代碼,通過(guò)測(cè)試來(lái)推動(dòng)整個(gè)開(kāi)發(fā)的進(jìn)行,可見(jiàn)測(cè)試在開(kāi)發(fā)中的重要程度,為此,Go提供了testing框架來(lái)方便我們編寫測(cè)試,本文將向大家介紹在Go中如何編寫測(cè)試代碼
    2023-07-07
  • Golang import本地包和導(dǎo)入問(wèn)題相關(guān)詳解

    Golang import本地包和導(dǎo)入問(wèn)題相關(guān)詳解

    這篇文章主要介紹了Golang import本地包和導(dǎo)入問(wèn)題相關(guān)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論