基於資料庫實現分布式鎖
要實現分布式鎖,最簡單的方式可能就是直接建立一張鎖表,然後通過操作該表中的資料來實現了。
當我們要鎖住某個方法或資源時,我們就在該表中增加一條記錄,想要釋放鎖的時候就刪除這條記錄.
唯一索引,想要執行某個方法,就使用這個
方法名向表中插入資料,成功插入則獲取鎖,執行完成後刪除對應的行資料釋放鎖。
上面這種簡單的實現有以下幾個問題:
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 ...