比如:
白話文就是、如果使用本地鎖(synchronized)的話、在微服務中、單個服務是可以鎖的、假如開多個例項、通過閘道器進行訪問、多個例項a、b、c、d 服務都會從新查詢、鎖不住多個例項、
分布式鎖就是解決這一問題、多個例項共享同乙個中介軟體裡面的值(redis)
分布式鎖會出現集中問題、帶著問題碼著**肯定是思路清晰到***
1)、階段一
setnx佔好了位、業務**異常或者程式在頁面過程中宕機、沒有執行刪除邏輯、這就造成了死鎖
解決:設定鎖的自動過期、即使沒有刪除、也會自動過期
2)、高階到階段二獲取到鎖之後、就設定過期時間1、sentnx設定好、正要去設定過期時間、宕機又死鎖了
解決:設定過期時間和佔位必須是原子的、redis支援使用sentnx ex命令
boolean lock = stringredistemplate.opsforvalue().setifabsent(「lock」, 「111」, 300, timeunit.seconds);3)、高階到階段三1、刪除鎖直接刪除??
如果由於業務時間很長、鎖自己過期了,我們直接刪除、有可能把別人正在持有的鎖刪除了
解決:站鎖的時候、值指定為uuid,每個人匹配自己的鎖才刪除(保證刪鎖的時候不是別人的鎖)
string uuid = uuid.
randomuuid()
.tostring()
;//設定過期時間、必須和加索是同步的、原子的、要不全成功、要不全失敗
boolean lock = stringredistemplate.
opsforvalue()
.setifabsent
("lock"
, uuid,
300, timeunit.seconds)
; string lockvalue = stringredistemplate.
opsforvalue()
.get
("lock");
if(uuid.
equals
(lockvalue)
)
4)、高階到階段四如果正好判斷是當前值、正要刪除鎖的時候,鎖已經過期了,別人已經設定到了新值、那嗎我們刪除的是別人的鎖
解決:刪除鎖必須保證原子性。使用redis+lua指令碼完成、帶刪除線 ~~ 就是分布式鎖
public map
>
getcatalogjsonfromdbwithredislock()
finally
//設定過期時間、必須和加索是同步的、原子的、要不全成功、要不全失敗
"lock",30,timeunit.seconds); //設定過期時間
//執行刪除redis 問題:不是原子性----使用lua指令碼
// string lockvalue = stringredistemplate.opsforvalue().get("lock");
// if(uuid.equals(lockvalue))
return datafromdb;
}else
}
5)、階段五-最終形態保證加鎖 【佔位+過期時間】和刪除鎖 【判斷+刪除】 的原子性。更難的事情,鎖的自動續期
redis分布式鎖兩大核心
①、加鎖保證原子性
②、解鎖保證原子性
這樣才能鎖住所有的服務
string script = "if redis.call('get',keys[1]) == ar**[1] then return redis.call('del',keys[1]) else return 0 end";
redis的分布式鎖解決文件描述
其實redis布式鎖就這兩步、可以根據自己的業務進行改造
主要方面:
1、原子性加鎖
2、原子性解鎖
解釋下面的原子性解鎖的指令碼
redis 如果獲取 指定的lock
(keys[1]
) key == 指定的 uuid (ar**[1]
) 值 然後就呼叫 redis (then return redis.
call
('del'
,keys[1]
)) 刪除方法 把這個key
(keys[1]
)) 刪除
否則就返回0 (else
return
0 end")
而且刪除成功返回的是 1
string script =
"if redis.call('get',keys[1]) == ar**[1] then return redis.call('del',keys[1]) else return 0 end"
;
public map
>
getcatalogjsonfromdbwithredislock()
finally
return datafromdb;
}else
}
展示效果圖 分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
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的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...