每個方案都有各自的優缺點,例如mysql
雖然直觀理解容易,但是實現起來卻需要額外考慮鎖超時、加事務等,並且效能侷限於資料庫,諸如此類我們在此不作討論,重點關注redis
。
使用redis
作為分布式鎖的優點:對於redis
實現簡單,效能對比zookeeper
和mysql
較好。如果不需要特別複雜的要求,那麼自己就可以利用setnx
進行實現,如果自己需要複雜的需求的話那麼可以利用或者借鑑redission
。對於一些要求比較嚴格的場景來說的話可以使用redlock
。
使用redis
作為分布式鎖的缺點:需要維護redis
集群,如果要實現redlock
那麼需要維護更多的集群。
為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件:
setnx resourcename value
若加鎖了之後如果機器宕機那麼這個鎖就不會得到釋放所以會加入過期時間,加入過期時間需要和setnx
同乙個原子操作,在redis2.8
之前我們需要使用lua
指令碼達到我們的目的,之前的setnx
和expire
無法保證原子性,但是redis2.8
之後redis
支援nx
和ex
操作是同一原子操作。
這是redis
2.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
,但是隨著現代系統的多核和非同步,為了不斷提高的吞吐量,非同步非阻塞執行緒模型大行其道,這裡面非常熱門的框架就是netty
,netty
因其設計優秀,應用面廣,實際使用的場景廣泛,很多大型框架比如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不存在。如給定的...