分布式鎖的實現方式


  在進行大型網站技術架構設計以及業務實現的過程中,多少都會遇到需要使用分布式鎖的情況。那么問題也就接踵而至。分布式鎖zk和memcached以及redis三者都能實現,同樣是分布式鎖,三者的區別何在?各自適用什么場景?

一、Zookeeper

  實現原理:基於zookeeper瞬時有序節點實現的分布式鎖,其主要邏輯如下(該圖來自於IBM網站)。大致思想即為:每個客戶端對某個功能加鎖時,在zookeeper上的與該功能對應的指定節點的目錄下,生成一個唯一的瞬時有序節點。判斷是否獲取鎖的方式很簡單,只需要判斷有序節點中序號最小的一個。當釋放鎖的時候,只需將這個瞬時節點刪除即可。同時,其可以避免服務宕機導致的鎖無法釋放,而產生的死鎖問題。

優點:鎖安全性高,zk可持久化,且能實時監聽獲取鎖的客戶端狀態。一旦客戶端宕機,則瞬時節點隨之消失,zk因而能第一時間釋放鎖。這也省去了用分布式緩存實現鎖的過程中需要加入超時時間判斷的這一邏輯;

缺點:性能開銷比較高。因為其需要動態產生、銷毀瞬時節點來實現鎖功能。所以不太適合直接提供給高並發的場景使用

實現:可以直接采用zookeeper第三方庫curator即可方便地實現分布式鎖

適用場景:對可靠性要求非常高,且並發程度不高的場景下使用。如核心數據的定時全量/增量同步等

二、memcached分布式鎖

實現原理:memcached帶有add函數,利用add函數的特性即可實現分布式鎖。add和set的區別在於:如果多線程並發set,則每個set都會成功,但最后存儲的值以最后的set的線程為准。而add的話則相反,add會添加第一個到達的值,並返回true,后續的添加則都會返回false。利用該點即可很輕松地實現分布式鎖

優點:並發高效

缺點:1、memcached采用列入LRU置換策略,所以如果內存不夠,可能導致緩存中的鎖信息丟失;

           2、memcached無法持久化,一旦重啟,將導致信息丟失。

使用場景:高並發場景。需要1)加上超時時間避免死鎖;2)提供足夠支撐鎖服務的內存空間;3)穩定的集群化管理。

三、redis分布式鎖

  redis分布式鎖即可以結合zk分布式鎖鎖高度安全和memcached並發場景下效率很好的優點,其實現方式和memcached類似,采用setnx即可實現。需要注意的是,這里的redis也需要設置超時時間。以避免死鎖。可以利用jedis客戶端實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM