使用Redis做分布式鎖遇到的乙個問題

2021-09-12 10:46:32 字數 1288 閱讀 7235

加鎖**很簡單,lockname不存在時設值value,一分鐘時間過期,redis可以保證原子性

public

boolean

lock

(string lockname, string value)

解鎖用redis指令碼實現原子性,lockname和value作為指令碼引數

public

boolean

unlock

(string lockname, string value)

get lockname 的值與value比較,相等則刪除(解鎖),否則直接返回解鎖成功

@bean

public defaultredisscript

unlockscript()

測試**

string lockname =

"mylockname"

; string lockvalue =

"mylockvalue"

; system.out.

println

("lock result: "

+ redislock.

lock

(lockname, lockvalue));

system.out.

println

("unlock result: "

+ redislock.

unlock

(lockname, lockvalue)

);

lock result: true

unlock result: true

似乎加鎖和解鎖都成功了,但是redis裡鎖依然存在,沒有被刪除

原因在於springboot配置redistemplate採用了json序列化:

template.

setvalueserializer

(new

genericjackson2jsonredisserializer()

);

所以加鎖時mylockname的值不是mylockvalue而是"mylockvalue",而解鎖時執行的redis指令碼的引數是不帶雙引號的,導致直接走到else邏輯返回1。

Redis做分布式鎖

在分布式系統中,在介面沒 冪等性或者在某些場景下相同的服務需要有且僅有乙個服務執行的情況下,需要使用分布式鎖來保證系統的安全執行。分布式鎖的執行順序,有服務a,分別部署了三個節點為a1 a2 a3,為滿足我們上述需求,我們需要在共享的資料載體中做標記,即,a1開始執行的話,a2 a3不能在執行,直到...

Redis做分布式鎖

在分布式系統中,在介面沒 冪等性或者在某些場景下相同的服務需要有且僅有乙個服務執行的情況下,需要使用分布式鎖來保證系統的安全執行。分布式鎖的執行順序,有服務a,分別部署了三個節點為a1 a2 a3,為滿足我們上述需求,我們需要在共享的資料載體中做標記,即,a1開始執行的話,a2 a3不能在執行,直到...

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

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