本文主要介紹redisson的分佈式鎖,其他功能請查看redisson的中文文檔apihttps://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
首先導入redisson的依賴
<!--redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.6</version>
</dependency>
編寫redisson的配置文件
我們項目中使用的是阿里雲的redis ,其他配置文件都是採用redisson默認的,因爲是dev環境,採用的是單機版redis,圖中我圈住的地方就是單機版redisson採用的server,主從,集羣版請才用其他server,設置ssl鏈接的格式爲:redis://IP地址:端口號,有密碼的話後面serpassword();
下面是redisson常用的分佈式鎖方法
RLock(可重入鎖):
public void lock(String name) throws InterruptedException {
//獲得name的鎖
RLock lock = redissonClient.getLock(name);
//對name進行加鎖 線程會一直等待 直到拿到該鎖
lock.lock();
//嘗試對name進行加鎖,線程會一直等待 直到拿到該鎖 然後10秒後自動解鎖
lock.lock(10L,TimeUnit.SECONDS);
//對name進行解鎖,如果鎖不是該線程持有則會拋出異常
lock.unlock();
//強制對name進行解鎖,即此鎖不論是那個線程持有都會進行解鎖
lock.forceUnlock();
//嘗試對name進行加鎖,如果該鎖被其他線程持有,會等待10秒,然後返回是否成功,如果成功 會在20秒後自動解鎖
boolean b = lock.tryLock(10L, 20L, TimeUnit.SECONDS);
//嘗試對name進行加鎖 立即返回加鎖狀態 如果加鎖成功會在20秒後自動解鎖
boolean b1 = lock.tryLock(20L, TimeUnit.SECONDS);
//檢查該鎖是否被任何線程所持有
boolean locked = lock.isLocked();
//檢查該鎖是否當前線程持有
boolean heldByCurrentThread = lock.isHeldByCurrentThread();
//當前線程對該鎖的保持次數
int holdCount = lock.getHoldCount();
//該鎖的剩餘時間
long l = lock.remainTimeToLive();
}
以上是可重入鎖的常用方法,FLock(公平鎖)的使用方式跟以上一樣
其他鎖相關概念:
MultiLock(聯鎖):基於Redis的Redisson分佈式聯鎖RedissonMultiLock對象可以將多個RLock對象關聯爲一個聯鎖,每個RLock對象實例可以來自於不同的Redisson實例(同時加鎖,所有鎖都加成功纔算成功)
RedLock(紅鎖):基於Redis的Redisson紅鎖RedissonRedLock對象實現了Redlock介紹的加鎖算法。該對象也可以用來將多個RLock對象關聯爲一個紅鎖,每個RLock對象實例可以來自於不同的Redisson實例。(同時加鎖,大部分鎖加鎖成功纔算成功)