女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

tldb提供分布式鎖使用方法

OSC開源社區 ? 來源:OSCHINA 社區 ? 2023-11-02 14:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:donnie4w

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

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

lock 阻塞式請求鎖

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

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

Lock (string,int) 方法的使用

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

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

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

UnLock (string) 方法的使用

UnLock 為釋放分布式鎖時調用的方法??蛻舳嗽诔晒Λ@取分布式鎖后,服務器會返回一個該鎖的 key,客戶端執行完邏輯代碼的最后,必須顯式調用 UnLock (key) 來釋放該分布式鎖。如果沒有調用 unlock 釋放鎖,tldb 將等待鎖釋放的超時時間直至超時后強制釋放該鎖。

TryLock (string,int) 方法的使用

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

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

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

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

調用 lock 的程序:lock 方法是阻塞的

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

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

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)
...//業務邏輯代碼
這段程序應該比較易于理解,就是每隔 100 毫秒,循環獲取字符串 “testlock” 的分布式鎖直至成功。

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

        
   io.github.donnie4w      
   tlmq-j     
   0.0.2   

調用 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); //獲取分布式
      ... //執行業務邏輯程序
}finally {
     if (key!=null){
         mc.unLock(key); //釋放分布式鎖
     }
}

調用 trylock 方法

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

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

審核編輯:湯梓紅

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

    關注

    13

    文章

    9753

    瀏覽量

    87574
  • 數據庫
    +關注

    關注

    7

    文章

    3908

    瀏覽量

    65978
  • 字符串
    +關注

    關注

    1

    文章

    589

    瀏覽量

    21228
  • 代碼
    +關注

    關注

    30

    文章

    4894

    瀏覽量

    70449

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

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Redis 分布式的正確實現方式

    分布式一般有三種實現方式:1. 數據庫樂觀;2. 基于Redis的分布式;3. 基于ZooKeeper的
    的頭像 發表于 05-31 14:19 ?3792次閱讀

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

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

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

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

    Redis分布式有什么特性

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

    Redis分布式真的安全嗎?

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

    深入理解redis分布式

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

    Redis實現分布式的幾種方案

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

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

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

    redis分布式可能出現的問題

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

    redis分布式死鎖處理方案

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

    redis分布式三個方法

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

    如何實現Redis分布式

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

    redis分布式可能出現的問題及解決方案

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

    redis分布式的缺點

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

    分布式的三種實現方式

    分布式的三種實現方式? 分布式是在分布式系統中用于實現對共享資源進行訪問控制的一種機制。分布式
    的頭像 發表于 12-28 10:01 ?1240次閱讀