Redis(五)分布式鎖

2021-10-10 16:14:57 字數 899 閱讀 5978

1.分布式鎖是什麼

分布式鎖是控制分布式系統或不同系統之間共同訪問共享資源的一種鎖實現,如果不同的系統或同一系統的不同主機之間共享了某個資源時,往往通過互斥來防止彼此干擾。

2.分布式設計目的

可以保證在分布式部署的應用集群中,同乙個方法在同一操作只能被一台機器上的乙個執行緒執行。

3.設計要求

(1)這把鎖要是一把可重入鎖(避免死鎖)

(2)這把鎖有高可用的獲取鎖和釋放鎖功能

(3)這把鎖獲取鎖和釋放鎖的效能要好

為了確保分布式可用,我們至少要確保鎖滿足以下三個條件:

(1)互斥性,在任意時刻,只有乙個客戶端能持有鎖。

(2)不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證後續其他客戶端能加鎖。

(3)加鎖和解鎖必須是同乙個客戶端,客戶端自己不能把別人加的鎖給解了

4.分布式鎖實現方案分析

(1)獲取鎖的時候,使用setnx(setnx key val:當且僅當key不存在時,set乙個key為val的字串,返回1;若key存在,則什麼都不做,返回0)加鎖,鎖的value值為當前伺服器內網ip編號拼接任務標識,在釋放鎖的時候進行判斷,並使用expire命令或者setex為鎖新增乙個超時時間,超過該時間則自動釋放鎖,setex過期以秒為單位。

(2)釋放該鎖的時候,判斷是不是該鎖(即value為當前伺服器內網ip編號拼接任務標識),若是該鎖,則執行delete進行鎖釋放

5.分布式鎖可能出現的問題

在setnx之後setex之前出現了服務宕機,redis服務宕機導致redis鎖無法過期無法釋放,其他機器無法獲得分布式鎖。需要手動刪除key。

6.怎麼實現分布式鎖

(1)採用lua指令碼操作分布式鎖

(2)採用setnx、setex命令連用(確保原子性)的方式實現分布式鎖。

Redis 應用01 分布式鎖

在處理分布式應用併發的時候,常常會使用鎖。比如我們有個 num 3,應用對num操作 去資料庫取值 取完值,在記憶體中,進行邏輯運算後重新賦值 存回資料庫 當多個應用同時對num操作的時候 比如 a和b 都對num進行操作 取值 a1 b1 賦值 b1 b3 在資料庫操作中,如果執行順序是a1 a3...

redis2 分布式鎖

尚矽谷 陽哥 加鎖 stringredistemplate.opsforvalue setifabsent redis lock key,value setnx 釋放鎖 stringredistemplate.delete redis lock key 釋放鎖 stringredistemplate...

分布式鎖 3 分布式鎖租約續期

redis分布式鎖在加鎖的時候,我們一般都會給乙個鎖的過期時間 ttl 這是為了防止加鎖後client宕機,鎖無法被釋放的問題。但是所有這種姿勢的用法都會面臨同乙個問題,就是沒發保證client的執行時間一定小於鎖的ttl。雖然大多數程式設計師都會樂觀的認為這種情況不可能發生,但是各種異常情況都會導...