Redis實現分布式鎖

2021-10-03 03:53:43 字數 720 閱讀 6130

分布式鎖,是控制分布式系統之間同步訪問共享資源的一種方式。在分布式系統中,往往需要互斥來防止共享資源的併發訪問,從而保證資料一致性。

分布式鎖需要具備的特性

由於redis的操作都是原子性的,所以redis可以使用setnx expire del命令實現:

邏輯如下:

客戶端執行setnx方法,若設定成功了(返回1),則獲取鎖成功,設定過期時間(這個時間可以當作是最長持有時間),在這個事件內執行任務,執行完,執行del刪除(因為可能提前執行完了,還需要等待過期?很明顯不合理)

若設定失敗了(返回0),說明此時有其他客戶端占有鎖資源,此時需要等待

缺陷:雖然setnx expire del都是原子操作,但是它們組合在一起就是不是原子操作了。有可能執行完setnx成功後,客戶端宕機了,沒有設定超時,此時就會發生死鎖。

問題的本質還是,這一系列操作不是原子性的。

set key value [ex seconds] [px milliseconds] [nx|xx]

如:set key value ex 10 nx

這樣就使得加鎖,設定過期這一系列操作是乙個原子操作了。

清除大量的key很耗時,有可能會出現卡頓,我們在設定過期時間的時候可能在乙個範圍內選乙個隨機的時間來作為過期時間

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

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

redis實現分布式鎖

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

redis實現分布式鎖

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