分布式锁的实现方式
? 在進行大型網(wǎng)站技術架構設計以及業(yè)務實現(xiàn)的過程中,多少都會遇到需要使用分布式鎖的情況。那么問題也就接踵而至。分布式鎖zk和memcached以及redis三者都能實現(xiàn),同樣是分布式鎖,三者的區(qū)別何在?各自適用什么場景?
一、Zookeeper
? 實現(xiàn)原理:基于zookeeper瞬時有序節(jié)點實現(xiàn)的分布式鎖,其主要邏輯如下(該圖來自于IBM網(wǎng)站)。大致思想即為:每個客戶端對某個功能加鎖時,在zookeeper上的與該功能對應的指定節(jié)點的目錄下,生成一個唯一的瞬時有序節(jié)點。判斷是否獲取鎖的方式很簡單,只需要判斷有序節(jié)點中序號最小的一個。當釋放鎖的時候,只需將這個瞬時節(jié)點刪除即可。同時,其可以避免服務宕機導致的鎖無法釋放,而產(chǎn)生的死鎖問題。
優(yōu)點:鎖安全性高,zk可持久化,且能實時監(jiān)聽獲取鎖的客戶端狀態(tài)。一旦客戶端宕機,則瞬時節(jié)點隨之消失,zk因而能第一時間釋放鎖。這也省去了用分布式緩存實現(xiàn)鎖的過程中需要加入超時時間判斷的這一邏輯;
缺點:性能開銷比較高。因為其需要動態(tài)產(chǎn)生、銷毀瞬時節(jié)點來實現(xiàn)鎖功能。所以不太適合直接提供給高并發(fā)的場景使用
實現(xiàn):可以直接采用zookeeper第三方庫curator即可方便地實現(xiàn)分布式鎖
適用場景:對可靠性要求非常高,且并發(fā)程度不高的場景下使用。如核心數(shù)據(jù)的定時全量/增量同步等
二、memcached分布式鎖
實現(xiàn)原理:memcached帶有add函數(shù),利用add函數(shù)的特性即可實現(xiàn)分布式鎖。add和set的區(qū)別在于:如果多線程并發(fā)set,則每個set都會成功,但最后存儲的值以最后的set的線程為準。而add的話則相反,add會添加第一個到達的值,并返回true,后續(xù)的添加則都會返回false。利用該點即可很輕松地實現(xiàn)分布式鎖
優(yōu)點:并發(fā)高效
缺點:1、memcached采用列入LRU置換策略,所以如果內(nèi)存不夠,可能導致緩存中的鎖信息丟失;
?????????? 2、memcached無法持久化,一旦重啟,將導致信息丟失。
使用場景:高并發(fā)場景。需要1)加上超時時間避免死鎖;2)提供足夠支撐鎖服務的內(nèi)存空間;3)穩(wěn)定的集群化管理。
三、redis分布式鎖
? redis分布式鎖即可以結合zk分布式鎖鎖高度安全和memcached并發(fā)場景下效率很好的優(yōu)點,其實現(xiàn)方式和memcached類似,采用setnx即可實現(xiàn)。需要注意的是,這里的redis也需要設置超時時間。以避免死鎖。可以利用jedis客戶端實現(xiàn)
轉載于:https://www.cnblogs.com/moonandstar08/p/5705619.html
總結
- 上一篇: 在使用JEDate时间控件时,不能捕捉到
- 下一篇: webstorm破解