一、為什麼要做
無疑,關於分布式鎖,我們都已比較熟悉,網上有較多的開源解決方案,如redis的redisson,以及zookeeper的curator等,關於這兩種分布式鎖的使用及原理,後期會寫文章介紹。本文主要針對小白,分享一下我學習分布式鎖的一些心得,如果是大神請留下您的寶貴意見。
二、俯視**
關於**,我寫的比較精簡,力爭在保證功能的情況下讓使用上變得更加簡單。
1.設計思路
redis鎖的核心注意點主要有:
在設計上主要參考了juc鎖的使用模式,實現其lock介面,在使用上當作reentranlock使用即可。
2.**分析
首先看一下鎖的主體,首先在過期時間上採取乙個比較折中的策略:預設30s,目前直接在**寫死,後期優化成可配置的形式,這樣程式宕掉也不至於長時間的不可用;其次,關於業務執行緒可能阻塞導致的執行時間過長的問題,這邊可以看到在lock的時候會啟動乙個watchdog執行緒,此執行緒的作用是用於監視key的剩餘過期時間,發現過小時完成自動續約,以此來保證鎖不會被提前釋放。
@component
@slf4j
public class defaultlock implements lock 獲取分布式鎖失敗",thread.currentthread().getname());
}//2.這裡應對有些需要沒有獲取到鎖直接返回失敗的場景,後期會做乙個策略優化
// boolean re = redistemplate.opsforvalue().setifabsent(lock, uuid.randomuuid(), default_expire_time, timeunit.seconds);
// if(boolean.false.equals(re))
//走到這裡說明獲取分布式鎖成功,開啟執行緒監視key過期時間,防止業務流程還沒結束就釋放鎖的情況
startwatchdog();
}private void startwatchdog()
@override
public void lockinterruptibly() throws interruptedexception
@override
public boolean trylock()
@override
public boolean trylock(long time, timeunit unit) throws interruptedexception
@override
public void unlock()
@override
public condition newcondition()
}
再來看一下watchdog的實現,比較簡單,主要完成續約的問題。
public class watchdog extends thread
public boolean isbusinessdone()
public void setbusinessdone(boolean businessdone)
@override
public void run()
//為避免空轉太頻繁,適當讓執行緒sleep
try catch (interruptedexception e) }}
}
使用上比較簡單,用ioc注入defaultlock例項即可。
public class zmqtestcontroller
count--;
log.info("當前執行緒:{},庫存扣減成功,剩餘庫存:{}",thread.currentthread().getid(),count);
}catch (exception e)finally
return "成功";
Python 基於Redis實現乙個分布式讀寫鎖
1 簡述出現背景 python 基於redis實現乙個簡單的分布式鎖 python 基於redis實現乙個分布式可重入鎖 在前面實現了簡單分布式鎖是用來解決分布式場景下的併發寫資料問題,分布式可重入鎖是用來解決併發場景下同一執行緒下再次或多次獲得鎖的問題。那麼分布式讀寫鎖又是解決什麼問題的呢?首先來...
談談基於Redis分布式鎖(上) 手寫方案
單體架構的應用可以直接使用本地鎖 synchronized 就可以解決多執行緒資源競爭的問題。如果公司業務發展較快,可以通過部署多個服務節點來提高系統的並行處理能力。由於本地鎖的作用範圍只限於當前應用的執行緒。高併發場景下,集群中某個應用的本地鎖並不會對其它應用的資源訪問產生互斥,就會產生資料不一致...
編寫乙個redis分布式鎖
分布式鎖 無論集群伺服器有多少臺,使用了該分布式鎖之後都可以統一的對某乙個資源進行鎖定 某個使用者加鎖之後只有他將分布式鎖釋放了才能讓其它的人操作資源。redis分布式鎖 根據redis中的乙個key的是否存在來實現的 如果key不存在則說明沒有人加鎖,所以建立key成功表示鎖獲取到了 如果key存...