Redis分布式鎖(一)

2021-10-08 09:04:33 字數 2215 閱讀 2685

每個方案都有各自的優缺點,例如mysql雖然直觀理解容易,但是實現起來卻需要額外考慮鎖超時加事務等,並且效能侷限於資料庫,諸如此類我們在此不作討論,重點關注redis

使用redis作為分布式鎖的優點:對於redis實現簡單,效能對比zookeepermysql較好。如果不需要特別複雜的要求,那麼自己就可以利用setnx進行實現,如果自己需要複雜的需求的話那麼可以利用或者借鑑redission。對於一些要求比較嚴格的場景來說的話可以使用redlock

使用redis作為分布式鎖的缺點:需要維護redis集群,如果要實現redlock那麼需要維護更多的集群。

為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件

setnx resourcename value
若加鎖了之後如果機器宕機那麼這個鎖就不會得到釋放所以會加入過期時間,加入過期時間需要和setnx同乙個原子操作,在redis2.8之前我們需要使用lua指令碼達到我們的目的,之前的setnxexpire無法保證原子性,但是redis2.8之後redis支援nxex操作是同一原子操作。

這是redis2.8之後擴充套件了set方法的引數:

public

class

redistool

return

false; } }

其實加鎖就一行**:

jedis.set(lockkey, requestid, set_if_not_exist, set_with_expire_time, expiretime);
可以看到,我們加鎖就一行**:jedis.set(string key, string value, string n***, string expx, int time),這個set()方法一共有五個形參:

public

class

redistool

return

false; } }

jedis出現的時間比較長了,接觸redis比較早的人可能使用的都是jedis,但是隨著現代系統的多核和非同步,為了不斷提高的吞吐量,非同步非阻塞執行緒模型大行其道,這裡面非常熱門的框架就是nettynetty因其設計優秀,應用面廣,實際使用的場景廣泛,很多大型框架比如hadoop,dubbo等許多的底層都是通過netty來實現的通訊。redission就是redis基於netty封裝的通訊客戶端。

redission

org.redisson

redisson

3.10.4

// 1. create config object

config = ...

// 2. create redisson instance

redissonclient redisson = redisson.create(config);

// 3. get redis based object or service you need

rmapmap = redisson.getmap("mymap"); rlock lock = redisson.getlock("mylock") lock.lock(); //業務** lock.unlock();

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...

redis分布式鎖

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