zookeeper:
1、基於zookeeper瞬時有序節點實現的分布式鎖,其主要邏輯如下(該圖來⾃自于ibm⽹**)。⼤大致思想即為:每個客戶端對某個功能加鎖時,在zookeeper上的與該功能對應的指定節點的⽬目錄下,⽣生成⼀乙個唯⼀一的瞬時有序節點。判斷是否獲取鎖的⽅方式很簡單,只需要判斷有序節點中序號最⼩小的⼀乙個。當釋放鎖的時候,只需將這個瞬時節點刪除即可。同時,其可以避免服務宕機導致的鎖⽆無法釋放,⽽而產⽣生的死鎖問題。
2、優點鎖安全性⾼高,zk可持久化,且能實時監聽獲取鎖的客戶端狀態。⼀一旦客戶端宕機,則瞬時節點隨之消失,zk因⽽而能第⼀一時間釋放鎖。這也省去了了⽤用分布式快取實現鎖的過程中需要加⼊入超時時間判斷的這⼀一邏輯。
3、缺點效能開銷⽐比較⾼高。因為其需要動態產⽣生、銷毀瞬時節點來實現鎖功能。所以不不太適合直接提供給⾼高併發的場景使⽤用。
4、實現可以直接採⽤用zookeeper第三⽅方庫curator即可⽅方便便地實現分布式鎖。
5、適⽤用場景對可靠性要求⾮非常⾼高,且併發程度不不⾼高的場景下使⽤用。如核⼼心資料的定時全量量/增量量同步等。
memcached:
1、memcached帶有add函式,利利⽤用add函式的特性即可實現分布式鎖。add和set的區別在於:如果多執行緒併發set,則每個set都會成功,但最後儲存的值以最後的set的執行緒為準。⽽而add的話則相反,add會新增第⼀乙個到達的值,並返回true,後續的新增則都會返回false。利利⽤用該點即可很輕鬆地實現分布式鎖。
2、優點併發⾼高效
3、缺點memcached採⽤用列列⼊入lru置換策略略,所以如果記憶體不不夠,可能導致快取中的鎖資訊丟失。memcached⽆無法持久化,⼀一旦重啟,將導致資訊丟失。
4、使⽤用場景⾼高併發場景。需要
1)加上超時時間避免死鎖;
2)提供⾜足夠⽀支撐鎖服務的記憶體空間;
3)穩定的集群化管理理。
redis:
redis分布式鎖即可以結合zk分布式鎖鎖⾼高度安全和memcached併發場景下效率很好的優點,其實現⽅方式和memcached類似,採⽤用setnx即可實現。需要注意的是,這⾥裡里的redis也需要設定超時時間。以避免死鎖。可以利利⽤用jedis客戶端實現。
1 icachekey cachekey=newconcurrentcachekey(key,type);
2 returnredisdao.setnx(cachekey,"1");
實現分布式鎖的三種方式
1 資料庫的樂觀鎖 版本號機制 悲觀鎖與樂觀鎖 2 基於redis的分布式鎖 加鎖public class redistool return false 我們加鎖就一行 jedis.set string key,string value,string n string expx,int time 這...
實現分布式鎖的三種方式
類似的文章網上一搜一大把,實現方式也無非這三種,不過自己還是總結一下吧,實際應用中只採用過快取來實現 通過增刪操作,借助資料庫唯一索引的唯一性或主鍵唯一性,來實現 缺點 資料庫單點問題,如果資料庫掛了,會導致業務系統不可用 獲取鎖後,沒有失效時間,如果解鎖失敗,就會導致鎖記錄始終在資料庫中,其他執行...
分布式鎖有三種實現方式
setnx,是 set if not exists 的縮寫,也就是只有不存在的時候才設定,可以利用它來實現鎖的效果。快取過期時,通過 setnx 獲取鎖,如果成功了,那麼更新快取,刪除鎖,需要注意的是 ok redis set key,random,array nx ex ttl if ok zk ...