使用Redis實現分布式鎖

2022-07-04 09:33:09 字數 1083 閱讀 9490

分布式鎖簡介

分布式鎖是控制分布式系統或不同系統之間共同訪問共享資源的一種鎖實現。

分布式鎖可以保證在分布式系統中,同一操作只被一台機器上的乙個執行緒執行,保證共享資料的一致性。

分布式鎖的設計要求(1)setnx(string key,string value)   

若返回1,說明設定成功,獲取到鎖;

若返回0,說明設定失敗,已經有了這個key,說明其它執行緒持有鎖,重試。

重試需要設定乙個超時時間|重試次數,不能一直嘗試、阻塞在這裡,達到超時時間|指定次數後還未獲取到鎖就放棄,實現高可用。

重試可以用while(true)來實現,如果未獲取到鎖,thread.sleep()沉睡1s後再次執行,if(重試次數達到多少)就放棄;如果獲取到鎖(返回1),結束迴圈,繼續往下執行。

value可以是任意的,但為了可讀性、方便除錯|維護,哪個機器的哪個執行緒的哪個方法要獲取鎖,一般就以 ip|主機名+執行緒名+方法名 拼接為識別符號,作為value。

(2)expire(string key, int seconds) 

獲取到鎖(返回1)後,還需要用設定生存期,如果在多少秒內沒有完成,比如發生機器故障、網路故障等,鍵值對過期,釋放鎖,實現高可用。

(3)del(string key)

完成業務後需要釋放鎖。釋放鎖有2種方式:del刪除key,或者expire將有效期設定為0(馬上過期)。

在執行業務過程中,如果發生異常,不能繼續往下執行,也應該馬上釋放鎖。

上述方法是jedis中的方法,如果使用spring data redis,對應的方法如下

boolean  redistemplate.opsforvalue().setifabsent(key,value)     //absent,缺席、不存在。返回的是布林值

redistemplate.expire(key,2,timeunit.minutes)   //有效期

boolean  redistemplate.opsforvalue().setifabsent(key,value,2,timeunit.minutes)    //上面2句**可以寫成一句

redistemplate.delete(key)   //刪除key

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

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

使用Redis實現分布式鎖

網上大部分建議都是使用setnx,這個本身沒有什麼問題,因為低版本的redis中,只有這個命令可以互斥的set乙個key。但是隨著redis版本的公升高,提供了更多的命令來更好的滿足我們的需求。set keyvalue ex seconds px milliseconds nx xx 這可和你所知道...

使用redis 實現分布式鎖

在有些需要高可用的場景中,保證併發量的情況下需要使用分布式鎖來做控制,保證應用的可靠性。我們知道jdk提供了一些常用的鎖比如reentrantlock,reentrantreadwritelock,synchronized。對於這些鎖的實現這裡就不詳細介紹了,在使用過程中這些鎖鎖的是物件,在單伺服器...