Redis分布式鎖實現

2021-09-29 08:41:44 字數 628 閱讀 7107

1:為什麼需要分布式鎖

乙個web應用部署在多台伺服器上,在程式內部使用鎖,如synchronized(),在單台伺服器上確實沒問題,但是只能控制單台伺服器的執行緒執行,對於部署在其他伺服器上的應用無法控制,會導致執行緒安全問題。

synchronized (this)finallyfinally{

//保證每個執行緒釋放自己的鎖

if(lockvalue .equals(redistemplate.get(lockkey))){

redistemplate.deletekey(lockkey)

存在問題:鎖的存活時間和主**邏輯的執行時間不好控制,即使將鎖的存活時間遠大與主**的執行時間,但仍然會存在主**的執行時間超過鎖存活時間(慢查詢,網路差)。

解決思路:在獲取鎖之後,開啟乙個執行緒,執行緒裡面開啟定時器(延遲時間和間隔時間可以設定為主**執行時間的1/3),去定時讀取鎖的key值,如果可以獲取到key,說明key存在,延長key的存活時間。不存在則說明主線程中已經刪除key了,則關閉定時器。具體**我也沒弄懂,可以看redisson框架原始碼,使用redisson框架封裝好的api實現分布式鎖。

5:redis分布式鎖效能優化(待補充)

6:redis分布式 主從節點切換導致分布式鎖失效解決(待補充)

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

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

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...

redis實現分布式鎖

分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...