分佈式鎖的實現原理和三種實現方式

首先說一下鎖的理解,是指對資源的獨佔使用,具備排他性,在某些業務情景是必要條件,但不能亂用,由於好比會對性能有很大的影響。java

用java舉例子,在單機器的狀況下能夠經過Synchronized或者ReentrantLock,對須要加鎖的資源枷鎖能夠是類方法或者類屬性、變量等。redis

隨着互聯網的興起,大部分互聯網業務單機已經沒法支撐,所以大量的分佈式設計應運而生,這時候在單機上容易實現的鎖就不是那麼簡單和直接了。數據庫

目前主流的分佈式鎖的實現方式有三種:緩存

1.藉助數據庫來實現,新建一張鎖表分佈式

操做前向表添加一條鎖記錄(鎖id創建惟一索引),成功添加者得到鎖權限,處理完後刪除鎖記錄來釋放鎖,這種方法弊端較多,固然也都有應對措施,好比但節點故障問題,解鎖失敗會死鎖問題,對應的解決方案有數據庫集羣,定時間清理死鎖數據,這裏沒有列全能夠本身模擬體會。此種方式並非主流的實現方式。固然也能夠經過 for update的 排他鎖來實現,這種方式就須要注意數據庫必須是innodb的引擎。性能

2.基於緩存實現,如memcache 和 redis設計

memcache的add操做具備原子性,能夠保證同一個key add操做只有一個成功,來獲取鎖權限,利用緩存的失效時間來解決死鎖問題。相對於第一種方案,這種方案性能更好,並且操做更方便。索引

3.經過zookeeper實現,這個目前來講最主流的解決方案資源

原理簡介,客戶端會在zookeeper生成一個臨時的目錄節點,存儲在一個序列中,每次節點序號最小的節點對應的客戶端得到鎖,處理完成後刪除最小節點,並且可重複獲取鎖(經過判斷序號是否和最小的節點相同)。innodb

分佈式特色解決了單點故障問題,並且相對於前兩種方式,這種方式能夠實現阻塞分佈式鎖,和鎖的重複獲取問題。

若有理解錯誤,或者您有更好的理解歡迎指正,萬分感謝

技術交流qq羣:208779755

歡迎關注我的公衆號

相關文章
相關標籤/搜索