Redis分布式鎖的實現

2021-09-27 17:57:25 字數 847 閱讀 8042

分布式鎖應滿足的四個條件:

1、加鎖原理:

setnx:設定<「lock」,「***」>;

setex:設定過期時間;

setnx是set if not exist,即當key不存在時,我們進行set操作;若key已經存在,則不做任何操作。

lock為key無其他含義

***為請求id(每個jvm程式乙個),可以通過uuid得到乙個隨機值將其存入threadlocal中。

每次加鎖的時候先判斷該鎖(lock)是否存在,若不存在則加鎖;若存在則從自己的threadlocal中取出請求id並與***比較,若相同則直接使用該鎖,若不同則加鎖失敗。

低版本的jedis不支援多引數的set命令,所以以前是兩條命令分開執行的,但是這樣會發生的問題顯而易見,如果第一步加鎖成功,然而此時加鎖的jvm程式突然斷電宕機,那麼過期時間沒有設定 上,該鎖將不會被其他jvm程式得到,將會造成阻塞。

現在高版本的jedis支援多引數的set命令,所以將這兩條命令合併為一條命令,保證了原子執行。但是對於過期時間的設定不好確定,所以應該增加乙個守護執行緒(所有使用者執行緒結束守護執行緒自動結束)為該鎖續期。

2、解鎖原理:

requestid.equals(jedis.get(lockkey)):判斷該鎖是否屬於當前執行緒;

jedis.del(lockkey):刪除這把鎖;

這兩條命令也要原子執行,否則將會誤解別人的鎖。通過lua指令碼(redis是單程序單執行緒執行的,它會將整個lua指令碼全部執行完才會執行其他命令)將這兩條命令原子執行。

3、使用redisson框架

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

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

redis實現分布式鎖

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

redis實現分布式鎖

分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...