分佈式鎖實現的幾種方式
基於數據庫實現分佈式鎖(表、數據庫排他鎖)html
基於緩存(redis,memcached,tair)java
基於Zookeeper實現分佈式鎖redis
關注點:算法
單點問題?(集羣)數據庫
失效時間?(鎖的釋放 VS 失效)緩存
非阻塞?(while自旋 || wacther通知)分佈式
非可重入?(記錄當前得到鎖的機器的主機信息和線程信息;三種方式都是)memcached
根據不一樣的應用場景正確選擇:源碼分析
————————————————————性能
從理解的難易程度角度(從低到高)
數據庫 > 緩存 > Zookeeper
————————————————————
從實現的複雜性角度(從低到高)
Zookeeper >= 緩存 > 數據庫
————————————————————
從性能角度(從高到低)
緩存 > Zookeeper >= 數據庫
————————————————————
從可靠性角度(從高到低)
Zookeeper > 緩存 > 數據庫
————————————————————
ZK分佈式鎖的實現
ZK分佈式鎖以前有提過,有簡單互斥鎖、互斥鎖、讀寫鎖;互斥鎖是在簡單互斥鎖的基礎上進行了優化,防止羊羣效應問題,直接根據事件通知下一子節點來得到鎖;
調整後的分佈式鎖算法流程以下:(優化爲「等待前一個子節點刪除通知」)
1.客戶端鏈接zookeeper,並在/lock下建立臨時的且有序的子節點,第一個客戶端對應的子節點爲/lock/lock-0000000000,第二個爲/lock/lock-0000000001,以此類推。
2.客戶端獲取/lock下的子節點列表,判斷本身建立的子節點是否爲當前子節點列表中序號最小的子節點,若是是則認爲得到鎖,不然監聽恰好在本身以前一位的子節點刪除消息,得到子節點變動通知後重復此步驟直至得到鎖;
3.執行業務代碼;
4.完成業務流程後,刪除對應的子節點釋放鎖。
分佈式鎖的幾種實現方式:http://www.hollischuang.com/archives/1716
基於Zookeeper的分佈式鎖(源碼分析):