分散式鎖
Redisson實現分散式鎖
Github:https://github.com/redisson/redisson
官網:Redisson: Easy Redis Java client with features of In-Memory Data Grid
實現步驟
- maven引入,進入redisson的github往下拉,readme中有步驟
點選檢視程式碼
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.27.2</version>
</dependency>
- 自己編寫 Redisson 的配置,建立 RedissonClient
- 因為spring-boot-starter 整合的 Redisson迭代較快,不推薦使用
- 新建Config配置,使用註解讀取application的redis配置資訊
- 建立 Redisson 例項,返回 Redisson 客戶端例項
- 測試Redisson
Redisson中的資料結構都繼承與Java的資料結構,比如Redisson其中的RList和RMap繼承的介面為List和ConcurrentMap
點選檢視程式碼
//引入Redisson客戶端
@Resource
private RedissonClient redissonClient;
4.定時任務+鎖
- getLock()獲取Redisson的鎖物件,需要指定鎖的名稱
- tryLock()嘗試獲取分散式鎖,獲取成功返回true
有兩個引數
waitTime:等待鎖時間,置0意味著只嘗試一次
leaveTime:鎖過期時間,時間一到就釋放鎖(這裡有個問題當執行時間超過鎖過期的時間,即鎖在程式執行中釋放了,通俗易懂點就我在拉屎,拉一半門開啟了,怎麼解決) - unLock:()釋放鎖,一般設定在finlly程式碼塊中,保證程式碼執行完後釋放鎖
點選檢視程式碼
RLock lock = redissonClient.getLock("lcok");
try {
if (lock.tryLock(0,30000L,TimeUnit.MILLISECONDS)){
System.out.printf("getLock: " + Thread.currentThread().getId());
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 只能釋放自己的鎖
if (lock.isHeldByCurrentThread()) {
System.out.println("unLock: " + Thread.currentThread().getId());
lock.unlock();
}
}