如何用Redis實現分布式鎖

2021-10-05 11:27:14 字數 1377 閱讀 4217

就是分布式系統要訪問共享資源,為了避免併發訪問資源帶來錯誤,我們為共享資源新增一把鎖,讓各個訪問互斥,保證併發訪問的安全性,這就是使用分布式鎖的原因。

1.在分布式系統環境下,乙個方法在同一時間只能被乙個機器的乙個執行緒執行

2.高可用的獲取鎖與釋放鎖

3.高效能的獲取鎖與釋放鎖

4.具備可重入特性(可理解為重新進入,由多於乙個任務併發使用,而不必擔心資料錯誤)

5.具備鎖失效機制,防止死鎖

6.具備非阻塞鎖特性,即沒有獲取到鎖將直接返回獲取鎖失敗

memcached:利用 memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情況下,才能 add 成功,也就意味著執行緒得到了鎖。

redis:和 memcached 的方式類似,利用 redis 的 setnx 命令。此命令同樣是原子性操作,只有在 key 不存在的情況下,才能 set 成功。

zookeeper:利用 zookeeper 的順序臨時節點,來實現分布式鎖和等待佇列。zookeeper 設計的初衷,就是為了實現分布式鎖服務的。

chubby:google 公司實現的粗粒度分布式鎖服務,底層利用了 paxos 一致性演算法。

加鎖

最簡單的方法是使用 setnx 命令。key 是鎖的唯一標識,按業務來決定命名。比如想要給一種商品的秒殺活動加鎖,可以給 key 命名為 「lock_sale_商品id」 。而 value 設定成什麼呢?我們可以姑且設定成 1。加鎖的偽**如下:

setnx(lock_sale_商品id,1)
當乙個執行緒執行 setnx 返回 1,說明 key 原本不存在,該執行緒成功得到了鎖;當乙個執行緒執行 setnx 返回 0,說明 key 已經存在,該執行緒搶鎖失敗。

解鎖

有加鎖就得有解鎖。當得到鎖的執行緒執行完任務,需要釋放鎖,以便其他執行緒可以進入。釋放鎖的最簡單方式是執行 del 指令,偽**如下:

del(lock_sale_商品id)
釋放鎖之後,其他執行緒就可以繼續執行 setnx 命令來獲得鎖。

鎖超時

鎖超時是什麼意思呢?如果乙個得到鎖的執行緒在執行任務的過程中掛掉,來不及顯式地釋放鎖,這塊資源將會永遠被鎖住(死鎖),別的執行緒再也別想進來。所以,setnx 的 key 必須設定乙個超時時間,以保證即使沒有被顯式釋放,這把鎖也要在一定時間後自動釋放。setnx 不支援超時引數,所以需要額外的指令,偽**如下:

expire(lock_sale_商品id, 30)

Redis 如何實現分布式鎖

分布式鎖需要解決的問題 1 互斥性 2 安全性 3 死鎖 4 容錯 setnx key value 如果key不存在,則建立並賦值 時間複雜度o 1 返回值 設定成功 返回1 設定失敗返回 0 get locknx nil 空值 不存在的 setnx locknx test 返回 1 如果再賦值一次...

Redis如何實現分布式鎖

一 redis分布式鎖實現思路redis實現分布式鎖基於setnx命令,因為在redis中key是保證是唯一的。所以當多個執行緒同時建立setnx時,只要誰能夠建立成功誰就能獲取到鎖。set命令 每次set時,可以修改原來舊值 setnx命令 每次setnx檢查key是否已經存在,如果已經存在的話就...

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

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