分布式鎖及其實現

2021-10-07 08:19:03 字數 1629 閱讀 9235

目錄

1.什麼是分布式鎖?

2.分布式鎖有什麼特性?

3.分布式鎖的實現有哪些?

4.redis的分布式鎖是怎麼實現嗎?

4.1 使用setnx指令

4.2 增加expire

4.3 使用set擴充套件命令

4.4 判斷key和刪除key是兩個操作,使用lua指令碼保證原子性。

4.5 單節點分布式鎖終極解決方案 redisson

5.分布式鎖的解決方案redlock

5.1 獲得鎖的過程是什麼?

6.實際業務開發中是怎麼使用的 參考

分布式鎖是分布式系統中共同訪問共享資源的一種鎖實現

1.互斥性                 同一時刻只能有乙個執行緒持有鎖。

2.超時釋放             鎖超時必須自動釋放,避免死鎖。

3.可重入性             乙個鎖在拿到鎖的情況下,可以再次加鎖。

4.高效能和高可用性 加鎖和釋放鎖的效能開銷竟可能的小,保證高可用性,防止分布式鎖意外失效

redis的分布式鎖,zookeeper的分布式鎖,etcd的分布式鎖

redis單機實現的分布式鎖 redission 

redis 分布式鎖的實現

setnx key value

do do something

del key

存在問題:do something 有問題,鎖一直不會釋放,因此需要增加鎖的過期時間

setnx key value

expire key 10

do do something

del key

存在的問題:setnx與expire 不是乙個原子性的,需要保證原子性

set key value nx ex 10

do something

del key

存在的問題:使用set擴充套件命令解決了原子性問題,但是do something耗時太長,會出現

1.鎖被提前釋放    程式時間執行太長,鎖提前釋放

2.鎖被誤刪     a程式執行太長,鎖提前釋放,b拿到鎖,但是a執行完釋放了b的鎖,a和b是同一把鎖

解決方案

1.**部分不要做過長的處理

2.釋放鎖時驗證鎖的持有者是否是自己

1.讓獲得鎖的執行緒開啟乙個定時守護執行緒,每隔expiretime/3,檢測一下鎖是否存在,如果存在,重置鎖的有效時間,利用守護執行緒對鎖進行續命。

redis 例項個數n

獲得鎖需要5步

1.獲取當前unix的時間,

2.順序獲得n個例項的鎖,設定獲得鎖的網路連線時間和超時時間。比如鎖自動失效時間10-50ms,鎖自動失效時間10s

3.超過一半的節點可以拿到鎖且使用時間小於鎖失效時間

使用時間=當前時間-1中的時間

4.獲取鎖成功,鎖的有效時間=有效時間-獲取鎖的時間

5.獲取鎖失敗,在所有的redis例項上進行解鎖。

原因:客戶端向服務端通訊是正常的,服務端向客戶端通訊超時,但是鎖確實已經加了。所以需要是失敗對加鎖失敗的例項也需要釋放鎖。

實際的業務開發中,一般使用基於單點的redis分布式鎖實現大部分的業務需求,偶爾出現資料不一致的場景,使用人工補資料進行解決。

1.的分布式鎖

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

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

分布式鎖實現

1,資料庫實現原理 資料庫的行級x鎖。優點 不需要引入第三方應用。缺點 死鎖 對資料庫效能影響,可能較長時間占用資料庫連線資源 如果業務是分庫分表的,可能支援不了 示例 2,快取實現原理 通過setnx是否成功。當且僅當 key 不存在,將 key 的值設為 value 並返回1 若給定的 key ...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...