精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

tldb提供分布式鎖使用方法

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2023-11-02 14:44 ? 次閱讀

作者:donnie4w

前言:分布式鎖是分布式系統(tǒng)中一個極為重要的工具。目前有多種分布式鎖的設計方案,比如借助 redis,mq,數(shù)據(jù)庫,zookeeper 等第三方服務系統(tǒng)來設計分布式鎖。tldb 提供的分布式鎖,主要是要簡化這個設計的過程,提供一個簡潔可靠,類似使用程序中對象鎖的方式來獲取分布式鎖。

tldb 提供分布式鎖使用方法:

lock 阻塞式請求鎖

trylock 嘗試加鎖,若鎖已被占用,則失敗返回,反之,則獲取該鎖

unlock 釋放已經(jīng)獲取的鎖 tldb 提供的分布式鎖功能主要在 MQ 模塊中實現(xiàn),調(diào)用的方法在 MQ 客戶端實現(xiàn),客戶端的實現(xiàn)實際非常簡單,除了目前已經(jīng)實現(xiàn)的幾種語言 java,golang,python,javaScript 寫的 simpleClient,其實其他開發(fā)者有興趣也可以實現(xiàn)其他語言的 MQ 客戶端,完全沒有技術(shù)門檻。分布式鎖由 tldb 服務器控制,所以它相對客戶端來說,也是跨語言的,如,用 java 客戶端上鎖的對象,其他語言同樣無法獲取該對象鎖。

Lock (string,int) 方法的使用

tldb 提供的是以字符串為鎖對象的獨占鎖, 如,lock ("abc",3) 必須提供兩個參數(shù)

第一個參數(shù)為鎖對象,即服務器對 “abc” 對象分配一個鎖,所有對 "abc" 對象請求加鎖的線程爭用一個獨占鎖,該方法為一個阻塞方法,請求到鎖則返回,如果鎖被其他線程占用,則一直阻塞直至獲取到鎖。

第二個參數(shù)為持有該分布式鎖的最長時間,單位為秒,例如 lock ("abc",3),意思是,如果超過 3 秒還沒有調(diào)用 unlock 釋放該鎖,服務器將強制釋放該鎖,繼續(xù)將鎖分配給其他請求的線程。

UnLock (string) 方法的使用

UnLock 為釋放分布式鎖時調(diào)用的方法。客戶端在成功獲取分布式鎖后,服務器會返回一個該鎖的 key,客戶端執(zhí)行完邏輯代碼的最后,必須顯式調(diào)用 UnLock (key) 來釋放該分布式鎖。如果沒有調(diào)用 unlock 釋放鎖,tldb 將等待鎖釋放的超時時間直至超時后強制釋放該鎖。

TryLock (string,int) 方法的使用

trylock 與 lock 相似,但是 lock 方法阻塞的,調(diào)用 lock 方法請求分布式鎖時,如果該鎖已經(jīng)被占用,那么 lock 方法將一直等待直至 tldb 服務器將鎖分配給它,這與程序中獲取獨占鎖的方式一致。而 trylock 時非阻塞的,調(diào)用 trylock 后會立即返回,如果獲取到鎖,tldb 會將標識該鎖的 key 一并返回,如何該鎖已經(jīng)被占用,服務器將返回空數(shù)據(jù)。

以下以 go 為例使用分布式鎖

因為 tldb 分布式的實現(xiàn)是在 MQ 模塊,所以 go 程序必須使用 tlmq-go, tldb 的 mq 客戶端進行調(diào)用鎖方法。

   import  "github.com/donnie4w/tlmq-go/cli"

調(diào)用 lock 的程序:lock 方法是阻塞的

sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
//以上為 客戶端連接MQ服務器
key, err := sc.Lock("testlock", 3)
//lock中兩個參數(shù),第一個參數(shù)為字符串,即tldb服務器為“testlock”分配一個全局的分布式鎖
//第二個參數(shù)3為客戶端持有該鎖的最長時間,表示超過3秒沒有釋放鎖時,tldb服務器將在服務端強制釋放該鎖,并分配給其他請求鎖的線程
if err!=nil{
    //獲取鎖失敗,需查看tldb能正常訪問
}else{
    defer sc.UnLock(key) //獲取鎖成功后,必須在程序最后調(diào)用Unlock
    //執(zhí)行業(yè)務邏輯程序
}
調(diào)用 tryLock 的程序,trylock 是非阻塞的
sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()

if key, ok := sc.TryLock("testlock2", 3); ok {
    //ok為true,表示已經(jīng)成功獲取到分布式鎖
    defer sc.UnLock(key) //在程序最后釋放鎖對象
    ...        
}

go 用自旋的方式使用 trylock 獲取分布式鎖,實現(xiàn)程序的阻塞等待

sc := cli.NewMqClient("ws://127.0.0.1:5001", "mymq=123")
sc.Connect()
var key string
for {
if  v, ok := sc.TryLock("testlock", 3); ok {
    key = v
break
} else {
<-time.After(100* time.Millisecond)
}
}
defer sc.UnLock(key)
...//業(yè)務邏輯代碼
這段程序應該比較易于理解,就是每隔 100 毫秒,循環(huán)獲取字符串 “testlock” 的分布式鎖直至成功。

以下以 java 為例java 客戶端為 tlmq-j :https://github.com/donnie4w/tlmq-j maven 配置

        
   io.github.donnie4w      
   tlmq-j     
   0.0.2   

調(diào)用 lock 方法

MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
//java連接服務器
String key = null;
try{
      key = mc.lock("testlock", 3); //獲取分布式
      ... //執(zhí)行業(yè)務邏輯程序
}finally {
     if (key!=null){
         mc.unLock(key); //釋放分布式鎖
     }
}

調(diào)用 trylock 方法

MqClient mc = new SimpleClient("ws://127.0.0.1:5001", "mymq=123");
mc.connect();
String key = null;
try{
      key = mc.tryLock("testlock", 3); //獲取分布式
      ... //執(zhí)行業(yè)務邏輯程序
} finally {
     if (key!=null){
         mc.unLock(key); //釋放分布式鎖
     }               
}
以下是 tldb 分布式鎖的功能測試數(shù)據(jù):多線程并發(fā) 調(diào)用 lock 獲取同一個對象鎖后,程序的運行數(shù)據(jù):
ecea2568-771a-11ee-939d-92fbcf53809c.png

多線程并發(fā)使用自旋的方式調(diào)用 trylock 與 lock 獲取同一個對象鎖:
ed0aad24-771a-11ee-939d-92fbcf53809c.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務器
    +關(guān)注

    關(guān)注

    12

    文章

    9017

    瀏覽量

    85182
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3763

    瀏覽量

    64274
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    577

    瀏覽量

    20485
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4744

    瀏覽量

    68344

原文標題:全新的分布式鎖,功能簡單且強大

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Redis 分布式的正確實現(xiàn)方式

    分布式一般有三種實現(xiàn)方式:1. 數(shù)據(jù)庫樂觀;2. 基于Redis的分布式;3. 基于ZooKeeper的
    的頭像 發(fā)表于 05-31 14:19 ?3572次閱讀

    Java:Redis分布式的原理和案例

    要介紹分布式,首先要提到與分布式鎖相對應的是線程、進程
    的頭像 發(fā)表于 07-01 11:49 ?3848次閱讀

    為什么需要分布式 基于Zookeeper安全嗎

    這篇文章我想和你聊一聊,關(guān)于 Redis 分布式的「安全性」問題。 Redis 分布式的話題,很多文章已經(jīng)寫爛了,我為什么還要寫這篇文章呢? 因為我發(fā)現(xiàn)網(wǎng)上 99% 的文章,并沒有
    的頭像 發(fā)表于 08-10 18:06 ?5582次閱讀

    Redis分布式有什么特性

    今天我們聊聊分布式。 1. 分布式是什么? 我們的手機有、車有、家門有
    的頭像 發(fā)表于 10-12 16:42 ?2326次閱讀

    Redis分布式真的安全嗎?

    今天我們來聊一聊Redis分布式
    的頭像 發(fā)表于 11-02 14:07 ?980次閱讀

    深入理解redis分布式

    深入理解redis分布式 哈嘍,大家好,我是指北君。 本篇文件我們來介紹如何Redis實現(xiàn)分布式的演進過程,以及為什么不能直接用Setnx實現(xiàn)
    的頭像 發(fā)表于 10-08 14:13 ?906次閱讀
    深入理解redis<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>

    Redis實現(xiàn)分布式的幾種方案

    本文將介紹什么是分布式,以及使用Redis實現(xiàn)分布式的幾種方案。 前言 了解分布式之前,需
    的頭像 發(fā)表于 10-11 15:19 ?655次閱讀

    什么是分布式 Redis的五種分布式方案

    本地加鎖的方式在分布式的場景下不適用,所以本文我們來探討下如何引入分布式解決本地的問題。本篇所有代碼和業(yè)務基于我的開源項目 PassJava。
    發(fā)表于 10-23 11:35 ?1079次閱讀
    什么是<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b> Redis的五種<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>方案

    redis分布式可能出現(xiàn)的問題

    Redis分布式是一種常用的機制,用于解決多個進程或多臺服務器對共享資源的并發(fā)訪問問題。然而,由于分布式環(huán)境的復雜性,使用Redis分布式
    的頭像 發(fā)表于 11-16 11:40 ?1353次閱讀

    redis分布式死鎖處理方案

    中,Redis分布式也可能遭遇死鎖問題,即多個線程相互等待對方釋放的情況。本文將詳細介紹Redis分布式死鎖的原因,并
    的頭像 發(fā)表于 11-16 11:44 ?1693次閱讀

    redis分布式三個方法

    Redis是一種高性能的分布式緩存和鍵值存儲系統(tǒng),它提供了一種可靠的分布式解決方案。在分布式系統(tǒng)中,由于多個節(jié)點之間的并發(fā)訪問,需要使用
    的頭像 發(fā)表于 12-04 11:22 ?1401次閱讀

    如何實現(xiàn)Redis分布式

    Redis是一個開源的內(nèi)存數(shù)據(jù)存儲系統(tǒng),可用于高速讀寫操作。在分布式系統(tǒng)中,為了保證數(shù)據(jù)的一致性和避免競態(tài)條件,常常需要使用分布式來對共享資源進行加鎖操作。Redis提供了一種簡單而
    的頭像 發(fā)表于 12-04 11:24 ?663次閱讀

    redis分布式可能出現(xiàn)的問題及解決方案

    Redis分布式是一種常見的解決分布式系統(tǒng)中并發(fā)問題的方案。雖然Redis分布式鎖具有許多優(yōu)點,但也存在一些潛在的問題需要注意。本文將詳細介紹Redis
    的頭像 發(fā)表于 12-04 11:29 ?916次閱讀

    redis分布式的缺點

    Redis分布式是一種常見的用于解決分布式系統(tǒng)中資源爭用問題的解決方案。盡管Redis分布式鎖具有很多優(yōu)點,但它也存在一些缺點。本文將從幾個方面詳細介紹Redis
    的頭像 發(fā)表于 12-04 14:05 ?1204次閱讀

    分布式的三種實現(xiàn)方式

    分布式的三種實現(xiàn)方式? 分布式是在分布式系統(tǒng)中用于實現(xiàn)對共享資源進行訪問控制的一種機制。分布式
    的頭像 發(fā)表于 12-28 10:01 ?858次閱讀