最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

分布式鎖一般有三種實(shí)現(xiàn)方式:1. 數(shù)據(jù)庫樂觀鎖;2. 基于Redis的分布式鎖;3. 基于ZooKeeper的分布式鎖。本篇博客將介紹第二種方式,基于Redis實(shí)現(xiàn)分布式鎖。雖然網(wǎng)上已經(jīng)有各種介紹Redis分布式鎖實(shí)現(xiàn)的博客,然而他們的實(shí)現(xià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)致的線程饑餓問題;
  • 不支持鎖的重入,持有鎖的協(xié)程再次申請鎖資源會導(dǎo)致死鎖;
  • 任何協(xié)程都可以調(diào)用 Mutex.Unlock 方法來解鎖,并不只允許占據(jù)鎖資源的協(xié)程進(jìn)行解鎖;
  • 不支持超時(shí)鎖獲取,也不支持 TryLock 機(jī)制

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

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

2. redisLock 的特性

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

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

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

重入性:分布式鎖不可重入,Go 語言并沒有優(yōu)雅的方式來實(shí)現(xiàn) Java 中的 ThreadLocal 機(jī)制
非公平性:分布式鎖存在非公平問題,在極端情況下會導(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)造分布式鎖實(shí)例
利用 NewRedisLock 以及 NewRedisLockWithExpireTime 函數(shù)能夠構(gòu)造出一個(gè)分布式鎖實(shí)例,NewRedisLockWithExpireTime 的區(qū)別在于其能夠自定義鎖的過期時(shí)間。

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 方法會在獲取鎖資源成功或者超時(shí)后返回。

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

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

相關(guān)文章

  • go語言實(shí)現(xiàn)銀行卡號Luhn校驗(yàn)

    go語言實(shí)現(xiàn)銀行卡號Luhn校驗(yàn)

    這篇文章主要為大家介紹了go語言Luhn校驗(yàn)測試銀行卡號碼的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • go mod包拉不下來的問題及解決方案

    go mod包拉不下來的問題及解決方案

    這篇文章主要介紹了go mod包拉不下來的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Go語言的變量、函數(shù)、Socks5代理服務(wù)器示例詳解

    Go語言的變量、函數(shù)、Socks5代理服務(wù)器示例詳解

    這篇文章主要介紹了Go語言的變量、函數(shù)、Socks5代理服務(wù)器的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對象校驗(yàn)結(jié)構(gòu)體

    GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對象校驗(yàn)結(jié)構(gòu)體

    這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對象校驗(yàn)結(jié)構(gòu)體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go程序中同一個(gè)包下為什么會存在多個(gè)同名的函數(shù)或變量(詳細(xì)解析)

    go程序中同一個(gè)包下為什么會存在多個(gè)同名的函數(shù)或變量(詳細(xì)解析)

    這篇文章主要介紹了go程序中同一個(gè)包下為什么會存在多個(gè)同名的函數(shù)或變量(詳細(xì)解析),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-05-05
  • golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例

    golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例

    這篇文章主要為大家介紹了golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • golang中snappy的使用場合實(shí)例詳解

    golang中snappy的使用場合實(shí)例詳解

    在java 和go語言 大字符傳達(dá)的時(shí)候, 采用snappy 壓縮 解壓縮是最好的方案。下面這篇文章主要給大家介紹了關(guān)于golang中snappy使用場合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • Go語言新寵:pdqsort排序算法的完美打造

    Go語言新寵:pdqsort排序算法的完美打造

    pdqsort是一種新的排序算法,特別適用于Go語言,它是由Go語言團(tuán)隊(duì)開發(fā)的,旨在提供高效且穩(wěn)定的排序算法,pdqsort采用了一種分治的策略,將數(shù)組分成小塊進(jìn)行排序,然后再合并這些塊,需要的朋友可以參考下
    2023-10-10
  • golang端口占用檢測的使用

    golang端口占用檢測的使用

    這篇文章主要介紹了golang端口占用檢測的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go語言設(shè)計(jì)模式之結(jié)構(gòu)型模式

    Go語言設(shè)計(jì)模式之結(jié)構(gòu)型模式

    本文主要聚焦在結(jié)構(gòu)型模式(Structural Pattern)上,其主要思想是將多個(gè)對象組裝成較大的結(jié)構(gòu),并同時(shí)保持結(jié)構(gòu)的靈活和高效,從程序的結(jié)構(gòu)上解決模塊之間的耦合問題
    2021-06-06

最新評論

曲阜市| 湛江市| 龙门县| 二手房| 北票市| 鹤峰县| 寿宁县| 奉贤区| 晋宁县| 新和县| 林芝县| 缙云县| 北海市| 巴东县| 新蔡县| 桂平市| 永川市| 江油市| 苍梧县| 神农架林区| 瑞昌市| 东阳市| 平谷区| 重庆市| 大宁县| 长宁区| 缙云县| 正安县| 岳普湖县| 若尔盖县| 云霄县| 丘北县| 修文县| 绥宁县| 定州市| 满洲里市| 长治市| 金堂县| 钟山县| 武宣县| 海宁市|