redis實現分布式鎖

2021-08-08 09:19:14 字數 1010 閱讀 3729

分布式鎖可以基於很多種方式實現,比如zookeeper、redis...。不管哪種方式,他的

基本原理是不變的:

用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。

1、使用redis的setnx命令實現分布式鎖  

1、實現的原理

redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶端對redis的連線並不存在競爭關係。redis的setnx命令可以方便的實現分布式鎖。

2、基本命令解析

1)setnx(set if not exists)

setnx key value

將 key 的值設為 value ,當且僅當 key 不存在。

setnx 是『set if not exists』(如果不存在,則 set)的簡寫

所以我們使用執行下面的命令:

setnx lock.foo

如返回1,則該客戶端獲得鎖,把lock.foo的鍵值設定為時間值表示該鍵已被鎖定,該客戶端最後可以通過del lock.foo來釋放該鎖。

如返回0,表明該鎖已被其他客戶端取得,這時我們可以先返回或進行重試等對方完成或等待鎖超時。

2)getset

語法:getset key value

返回值:

返回給定 key 的舊值。

當 key 沒有舊值時,即, key 不存在時,返回 nil 。

3)get

語法:get key

返回值:

當 key 不存在時,返回 nil ,否則,返回 key 的值。

如果 key 不是字串型別,那麼返回乙個錯誤

加鎖的實現**:這裡需要主要兩個引數,乙個是$timeout,這個是迴圈獲取鎖的等待時間,在這個時間內會一直嘗試獲取鎖知道超時,如果為0,則表示獲取鎖失敗後直接返回而不再等待;另乙個重要引數的$expire,這個引數指當前鎖的最大生存時間,以秒為單位的,它必須大於0,如果超過生存時間鎖仍未被釋放,則系統會自動強制釋放

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

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

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...

Redis實現分布式鎖

如果為空就插入值,返回true,如果不為空則不做操作,返回false param key param value return public static boolean setifabsent string key,string value 插入新值並返回舊值 獲取分布式鎖,獲取不成功會一直嘗試獲...