基於數據庫實現
加鎖,或類似redis記錄數據。性能不好不用!
基於Redis實現
這是比較常用的一種實現方式。
通過setnx可以存入key,如果存入key成功返回1,如果存入的key已經存在了,返回0.如此可以判斷key存在說明已經有節點調用,不存在說明沒有節點調用。
基於ZooKeeper的實現
多個客戶端(jvm),同時在zk上創建相同的一個臨時節點,因爲臨時節點路徑是保證唯一,只要誰能夠創建節點成功,誰就能夠獲取到鎖,沒有創建成功節點,就會進行等待,當釋放鎖的時候,採用事件通知給客戶端重新獲取鎖的資源。
對比
Zookeeper實現簡單,但效率較低;Redis實現複雜,但效率較高。
綜合對比我還是更喜歡使用redis實現分佈式鎖