分布式鎖 redis zookeeper

2021-10-24 23:55:17 字數 1400 閱讀 6717

在我們進行單機應用開發,涉及併發同步的時候,我們往往採用synchronized或者lock的方式來解決多執行緒間的**同步問題。但當我們的應用是分布式集群工作的情況下,那麼就需要一種更加高階的鎖機制,來處理種跨機器的程序之間的資料同步問題。這就是分布式鎖。

redis實現:

獲取鎖

string result = jedis.

set(key, value,

"nx"

,"px"

, expiremillis);if

(result != null && result.

equalsignorecase

("ok"))

setnx不能設定時間,setnx+expire不是原子性,所以直接用set

釋放鎖

string script =

"if redis.call('get', keys[1]) == ar**[1] then return redis.call('del', keys[1]) else return 0 end"

;object result = jedis.

eval

(script, collections.

singletonlist

(fullkey)

, collections.

singletonlist

(value));

if(objects.

equals

(unlock_success, result)

)

釋放鎖包括查詢key,比較value,然後直接del,這些操作無法保證原子性。一般用lua指令碼 保證原子性。

現在一般使用redission實現redis分布式鎖

zookeeper實現

使用zookeeper實現分布式鎖的演算法流程,大致如下:

如果鎖空間的根節點不存在,首先建立znode根節點。這裡假設為「/test/lock」。這個根節點,代表了一把分布式鎖。

客戶端如果需要占用鎖,則在「/test/lock」下建立臨時的且有序的子節點。

客戶端如果需要占用鎖,還需要判斷,判斷自己建立的子節點是否為當前子節點列表中序號最小的子節點。如果是則認為獲得鎖,否則監聽前乙個znode子節點變更訊息,獲得子節點變更通知後重複此步驟直至獲得鎖;

獲取鎖後,開始處理業務流程。完成業務流程後,刪除對應的子節點,完成釋放鎖的工作。以便後面的節點獲得分布式鎖。

一般使用curator框架來實現zk分布式鎖。

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式專題 分布式鎖

在傳統的單體應用架構中,遇到併發安全性問題時我們可以通過同步鎖synchronized,同步 塊,reentrantlock等方式都可以解決,但隨著業務的發展,單體應用架構不能滿足龐大的使用者請求量,於是分布式系統應用而生,在分布式系統中,由於每個系統都執行在不同的伺服器上,有著不同的jvm,所以j...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...