JAVA分布式鎖的實現

2021-08-19 23:52:24 字數 1319 閱讀 8494

基於資料庫實現分布式鎖

要實現分布式鎖,最簡單的方式可能就是直接建立一張鎖表,然後通過操作該表中的資料來實現了。

當我們要鎖住某個方法或資源時,我們就在該表中增加一條記錄,想要釋放鎖的時候就刪除這條記錄.

唯一索引,想要執行某個方法,就使用這個

方法名向表中插入資料,成功插入則獲取鎖,執行完成後刪除對應的行資料釋放鎖。

上面這種簡單的實現有以下幾個問題:

1、這把鎖強依賴資料庫的可用性,資料庫是乙個單點,一旦資料庫掛掉,會導致業務系統不可用。

2、這把鎖沒有失效時間,一旦解鎖操作失敗,就會導致鎖記錄一直在資料庫中,其他執行緒無法再獲得到鎖。

3、這把鎖只能是非阻塞的,因為資料的insert操作,一旦插入失敗就會直接報錯。沒有獲得鎖的執行緒並不會進入排隊佇列,要想再次獲得鎖就要再次觸發獲得鎖操作。

4、這把鎖是非重入的,同乙個執行緒在沒有釋放鎖之前無法再次獲得該鎖。因為資料中資料已經存在了。

當然,我們也可以有其他方式解決上面的問題。

基於redis實現分布式鎖

"nx"

, "ex"

, expireseconds)):

1.set

命令是原子性操作,

nx指令保證只要當

key不存在時才會設定

value

2.設定的

value

要有唯一性,來確保鎖不會被誤刪

(value=

系統時間戳

+uuid)3.當

上述命令執行返回

ok時,客戶端獲取鎖成功,否則失敗

4.客戶端可以

通過redis

釋放指令碼來

釋放鎖(del 命令)

5.如果鎖到達了最大生存時間將會自動釋放

只有當前

key的

value

和傳入的

value

相同才會執行

del命令。

基於zookeeper實現分布式鎖

判斷是否獲取鎖的方式很簡單,只需要判斷有序節點中序號最小的乙個。

當釋放鎖的時候,只需將這個瞬時節點刪除即可。同時,其可以避免服務宕機導致的鎖無法釋放,而產生的死鎖問題。

單點問題?使用zookeeper可以有效的解決單點問題,zk是集群部署的,只要集群中有半數以上的機器存活,就可以對外提供服務。

Java分布式鎖的實現

分布式鎖,是指在分布式的部署環境下,通過鎖機制來讓多客戶端互斥的對共享資源進行訪問。排他性 在同一時間只會有乙個客戶端能獲取到鎖,其它客戶端無法同時獲取 避免死鎖 這把鎖在一段有限的時間之後,一定會被釋放 正常釋放或異常釋放 可重入鎖 避免死鎖 高可用 獲取或釋放鎖的機制必須高可用且效能佳 針對分布...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

分布式鎖實現

1,資料庫實現原理 資料庫的行級x鎖。優點 不需要引入第三方應用。缺點 死鎖 對資料庫效能影響,可能較長時間占用資料庫連線資源 如果業務是分庫分表的,可能支援不了 示例 2,快取實現原理 通過setnx是否成功。當且僅當 key 不存在,將 key 的值設為 value 並返回1 若給定的 key ...