成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺談分布式鎖

legendmohe / 1554人閱讀

摘要:如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖?;诘姆植际芥i利用臨時節(jié)點與機制。

1. 什么是鎖?

? ?? ?在單進程的系統(tǒng)中,當存在多個線程可以同時改變某個變量時,就需要對變量或代碼塊做同步,使其在修改這種變量時能夠線性執(zhí)行消除并發(fā)修改變量。
? ?而同步的本質是通過鎖來實現(xiàn)的。為了實現(xiàn)多個線程在一個時刻同一個代碼塊只能有一個線程可執(zhí)行,那么需要在某個地方做個標記,這個標記必須每個線程都能看到,當標記不存在時可以設置該標記,其余后續(xù)線程發(fā)現(xiàn)已經(jīng)有標記了則等待擁有標記的線程結束同步代碼塊取消標記后再去嘗試設置標記。這個標記可以理解為鎖。
? ?不同地方實現(xiàn)鎖的方式也不一樣,只要能滿足所有線程都能看得到標記即可。如java中synchronize是在對象頭設置標記,Lock接口的實現(xiàn)類基本上都只是某一個volitile修飾的int型變量其保證每個線程都能擁有對該int的可見性和原子修改,linux內核中也是利用互斥量或信號量等內存數(shù)據(jù)做標記。

2. 什么是分布式鎖?

????分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。在分布式系統(tǒng)中,常常需要協(xié)調他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖。

3. 分布式鎖實現(xiàn)的幾種方式(每種方式都具備多種實現(xiàn)方案)

基于數(shù)據(jù)庫實現(xiàn)分布式鎖

基于數(shù)據(jù)庫樂觀鎖實現(xiàn):
樂觀鎖通常實現(xiàn)基于數(shù)據(jù)版本號(version)的記錄機制實現(xiàn)的,在修改數(shù)據(jù)庫前獲取版本號,修改數(shù)據(jù)時與獲取版本號不一致則拋出異常(修改數(shù)據(jù)時切記對版本號進行+1)

基于緩存(redis...)實現(xiàn)分布式鎖

使用redis的setnx()、get()、getset()方法,用于分布式鎖

setnx(lockkey, 當前時間+過期超時時間) ,如果返回1,則獲取鎖成功;如果返回0則沒有獲取到鎖,轉向2。

get(lockkey)獲取值oldExpireTime ,并將這個value值與當前的系統(tǒng)時間進行比較,如果小于當前系統(tǒng)時間,則認為這個鎖已經(jīng)超時,可以允許別的請求重新獲取,轉向3。

計算newExpireTime=當前時間+過期超時時間,然后getset(lockkey, newExpireTime) 會返回當前l(fā)ockkey的值currentExpireTime。

判斷currentExpireTime與oldExpireTime 是否相等,如果相等,說明當前getset設置成功,獲取到了鎖。如果不相等,說明這個鎖又被別的請求獲取走了,那么當前請求可以直接返回失敗,或者繼續(xù)重試。

在獲取到鎖之后,當前線程可以開始自己的業(yè)務處理,當處理完畢后,比較自己的處理時間和對于鎖設置的超時時間,如果小于鎖設置的超時時間,則直接執(zhí)行delete釋放鎖;如果大于鎖設置的超時時間,則不需要再鎖進行處理(這樣可以避免死鎖)。

基于Zookeeper的分布式鎖

????利用臨時節(jié)點與 watch 機制。每個鎖占用一個普通節(jié)點 /lock,當需要獲取鎖時在 /lock 目錄下創(chuàng)建一個臨時節(jié)點,創(chuàng)建成功則表示獲取鎖成功,失敗則 watch/lock 節(jié)點,有刪除操作后再去爭鎖。臨時節(jié)點好處在于當進程掛掉后能自動上鎖的節(jié)點自動刪除即取消鎖

4. 推薦開源分布式鎖lock-spring-boot-starter

????基于redisson實現(xiàn)的spring boot starter分布式鎖框架,實現(xiàn)了可重入鎖、公平鎖、聯(lián)鎖、紅鎖、讀寫鎖等常用鎖的方式,并支持集群模式下的redis。

為什么推薦此項目?

我參與項目的開發(fā)

高可用,使用簡單

支持單機模式,集群模式,云托管模式,哨兵模式

支持參數(shù)加鎖,對象屬性上加鎖,支持方法上加鎖

引入maven依賴即可使用

 
     io.gitee.tooleek
     lock-spring-boot-starter
     1.1.0
 

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/75904.html

相關文章

  • 淺談Java并發(fā)編程系列(一)—— 如何保證線程安全

    摘要:比如需要用多線程或分布式集群統(tǒng)計一堆用戶的相關統(tǒng)計值,由于用戶的統(tǒng)計值是共享數(shù)據(jù),因此需要保證線程安全。如果類是無狀態(tài)的,那它永遠是線程安全的。參考探索并發(fā)編程二寫線程安全的代碼 線程安全類 保證類線程安全的措施: 不共享線程間的變量; 設置屬性變量為不可變變量; 每個共享的可變變量都使用一個確定的鎖保護; 保證線程安全的思路: 1. 通過架構設計 通過上層的架構設計和業(yè)務分析來避...

    mylxsw 評論0 收藏0
  • 淺談緩存(一)

    摘要:緩存穿透場景當通過一個去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結果為緩存系統(tǒng)就不會緩存該數(shù)據(jù)每次該查詢都會經(jīng)過數(shù)據(jù)庫層造成沒有必要的開銷解決方案將該緩存至緩存系統(tǒng)中為一個特殊值緩存失效場景由于初始化的時候某些緩存過期時間設置的都一樣一段時間以后緩存全部失效在 緩存穿透 場景:當通過一個key去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結果為null,緩存系統(tǒng)就不會緩存該數(shù)據(jù),每次該key查詢都會經(jīng)過數(shù)據(jù)庫層,造成沒有必要的D...

    Shihira 評論0 收藏0
  • 淺談緩存(一)

    摘要:緩存穿透場景當通過一個去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結果為緩存系統(tǒng)就不會緩存該數(shù)據(jù)每次該查詢都會經(jīng)過數(shù)據(jù)庫層造成沒有必要的開銷解決方案將該緩存至緩存系統(tǒng)中為一個特殊值緩存失效場景由于初始化的時候某些緩存過期時間設置的都一樣一段時間以后緩存全部失效在 緩存穿透 場景:當通過一個key去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結果為null,緩存系統(tǒng)就不會緩存該數(shù)據(jù),每次該key查詢都會經(jīng)過數(shù)據(jù)庫層,造成沒有必要的D...

    B0B0 評論0 收藏0
  • 淺談緩存(一)

    摘要:緩存穿透場景當通過一個去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結果為緩存系統(tǒng)就不會緩存該數(shù)據(jù)每次該查詢都會經(jīng)過數(shù)據(jù)庫層造成沒有必要的開銷解決方案將該緩存至緩存系統(tǒng)中為一個特殊值緩存失效場景由于初始化的時候某些緩存過期時間設置的都一樣一段時間以后緩存全部失效在 緩存穿透 場景:當通過一個key去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結果為null,緩存系統(tǒng)就不會緩存該數(shù)據(jù),每次該key查詢都會經(jīng)過數(shù)據(jù)庫層,造成沒有必要的D...

    xzavier 評論0 收藏0

發(fā)表評論

0條評論

legendmohe

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<