Redis如何實現分布式鎖

2021-10-01 04:47:23 字數 2004 閱讀 9287

一、redis分布式鎖實現思路

redis實現分布式鎖基於setnx命令,因為在redis中key是保證是唯一的。所以當多個執行緒同時建立setnx時,只要誰能夠建立成功誰就能獲取到鎖。

set命令:每次set時,可以修改原來舊值;

setnx命令:每次setnx檢查key是否已經存在,如果已經存在的話就不會執行任何操作,返回0;反之,新增該key。

獲取鎖的時候:當多個執行緒同時建立setnx key,只要誰能夠建立成功誰就能夠獲取到鎖。

釋放鎖:可以對該key設定乙個有效期可以避免死鎖的現象。

二、zookeeper實現分布式鎖思路
zookeeper實現分布式鎖核心採用臨時節點+事件通知,因為zookeeper節點路徑是保證全域性唯一的,當多個執行緒同時建立該臨時節點,只要誰能夠建立成功誰就能獲取到鎖。

獲取鎖:當多個執行緒同時建立該臨時節點,只要誰能夠建立成功誰就能夠獲取到鎖。

釋放鎖:關閉當前session連線,自動的刪除當前的zk節點路徑,其他執行緒重新進入到獲取鎖階段。

三、分布式鎖應用場景
分布式任務排程平台保證任務的冪等性。

分布式全域性id的生成

四、redis分布式鎖核心**
public

class

redisutil

catch

(exception e)

}/**

* 在多執行緒環境同步初始化

*/private

static

synchronized

void

poolinit()

}/**

* 同步獲取jedis例項

** @return jedis

*/public

synchronized

static jedis getjedis()

jedis jedis = null;

try}

catch

(exception e)

return jedis;

}/**

* 釋放jedis資源

** @param jedis

*/public

static

void

returnresource

(final jedis jedis)

}public

static long sadd

(string key, string.

.. members)

catch

(exception e)

return res;

}}

public

class

redislock

// 否則情況下 在超時時間內繼續迴圈

}try

}catch

(exception e)

return null;

}/**

* 釋放鎖 其實就是將該key刪除

** @return

*/public boolean unlock

(string lockkey, string lockvalue)

return

false;}

}

public

class

testservice

// 2.獲取鎖成功執行業務邏輯

system.out.

println

(thread.

currentthread()

.getname()

+",獲取成功,lockvalue:"

+ lockvalue)

;// 3.釋放lock鎖

redislock.

unlock

(lockkey, lockvalue);}

}

Redis 如何實現分布式鎖

分布式鎖需要解決的問題 1 互斥性 2 安全性 3 死鎖 4 容錯 setnx key value 如果key不存在,則建立並賦值 時間複雜度o 1 返回值 設定成功 返回1 設定失敗返回 0 get locknx nil 空值 不存在的 setnx locknx test 返回 1 如果再賦值一次...

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

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

如何通過Redis實現分布式鎖

互斥性,安全性,死鎖,容錯 時間複雜度 o 1 返回值 設定成功,返回1 設定失敗,返回0。expire key seconds 設定key的生存時間,當key過期時 生存時間為0 會自動刪除 缺點 原子性得不到滿足 set key value ex secounds px milliseconds...