Redis分布式鎖完整使用

2021-10-10 06:01:10 字數 2806 閱讀 7038

比如:

白話文就是、如果使用本地鎖(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的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...