可靠的分布式鎖,要具備以下幾個特性
1.互斥性。在任意時刻,只有乙個客戶端能持有鎖
2.不會發生死鎖,即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證後續其他客戶端能加鎖。
3.具有容錯性。只要大部分的redis節點正常執行,客戶端就可以加鎖和解鎖。
4.解鈴還須繫鈴人。加速和解鎖必須是同乙個客戶端,客戶端自己不能把別人加的鎖給解了。
5.鎖不能自己失效。正常執行程式過程中,鎖不能因為某些原因失效。
加鎖流程
首先去看redis是否包含這個key,如果有再看下value是否匹配,如果有,執行hincrby重入次數加1,並pexpire設定失效時間,返回空值null,結束,如果沒有這個value,說明鎖被其他執行緒占用,通過pttl獲取key的剩餘時間並返回,返回key的剩餘時間,解鎖,如果redis不存在這個key,就會執行hset key uuid 1.設定鍵值並初始化重入次數為1,並用pexpire設定失效時間。
解鎖流程
首先去看redis是否包含這個key,如果有再看下value是否匹配,如果有,執行hincrby重入次數減1,重入數是否大於0,如果小於0就刪除key,廣播鎖釋放訊息(通知阻塞等待的執行緒或程序資源可用),如果大於0
執行pexpire重新設定過期時間,返回0值,結束,如果沒有這個key,廣播鎖釋放訊息(通知阻塞等待的執行緒或程序資源可用)
分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
redis實現分布式鎖
隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...
redis實現分布式鎖
分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...