分散式鎖機制

foxcyg發表於2024-04-09

分散式鎖

Redisson實現分散式鎖

Github:https://github.com/redisson/redisson
官網:Redisson: Easy Redis Java client with features of In-Memory Data Grid

實現步驟

  1. maven引入,進入redisson的github往下拉,readme中有步驟
點選檢視程式碼
<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.27.2</version>
</dependency> 
  1. 自己編寫 Redisson 的配置,建立 RedissonClient
  • 因為spring-boot-starter 整合的 Redisson迭代較快,不推薦使用
  • 新建Config配置,使用註解讀取application的redis配置資訊
  • 建立 Redisson 例項,返回 Redisson 客戶端例項
  1. 測試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();
            }
        }

相關文章