分散式鎖 MLock 使用介紹
分散式鎖 MLock gitee地址
分散式鎖 MLock github地址
系列文章連結:
- 分散式鎖(1)-分散式鎖簡介
- 分散式鎖(2)-基於Redis的實現
- 分散式鎖(3)-Redisson實現
- 分散式鎖(4)-基於Mysql實現
- 分散式鎖(5)-MLock使用介紹(自己實現,基於redis,適用於真實專案)
1.基於
使用java+redis實現了常用的分散式鎖,提供註解、程式碼兩種使用形式,方便簡單
2.特性
- 支援分散式鎖
- 支援分散式檢查鎖
- 支援分散式冪等
- 支援註解用法和模板用法
- 支援自動續約
3.快速開始
3.1依賴引入
<dependencies>
<!-- 開發測試 -->
<dependency>
<groupId>moon</groupId>
<artifactId>mlock</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- 正式版本 -->
<dependency>
<groupId>moon</groupId>
<artifactId>mlock</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
3.2 使用
- 分散式鎖 waitMills(等待鎖時間預設0,即只嘗試一次去獲取鎖) 注意:Lock需要程式碼裡面冪等,分散式冪等鎖不需要 註解用法
@Service
public class TestService {
@Lock(domain = "lockTest", keys = {"#pojo.id"}, lockType = LockTypeEnum.LOCK_REDIS, waitTime = 60000)
public void lockTest(Pojo pojo) {
// todo
}
}
- 模板用法
@Service
public class TestService {
public void lockTemplateTest(Pojo pojo) {
LockTemplate<Boolean> lockTemplate = new LockTemplate<>();
String lockKey = String.valueOf(pojo.getId());
Boolean lockResult = lockTemplate.execute(
LockTypeEnum.LOCK_REDIS,
"lockTest",
lockKey,
60000,
TimeUnit.SECONDS,
new ILockCallback<Boolean>() {
@Override
public Boolean success() throws LockException {
// 這裡放需要被加鎖的程式碼
return null;
}
@Override
public Boolean fail() throws LockException {
return null;
}
@Override
public Boolean ex(Exception e) throws LockException {
return null;
}
}
);
}
}
- 分散式檢查鎖 檢查鎖的存在,不加鎖,若已加鎖,跳過執行或丟擲指定異常
@Service
public class TestService {
@CheckLock(domain = "checkLockTest", keys = {"#pojo.id"}, lockType = LockTypeEnum.LOCK_REDIS_FORCE)
public void checkLockTest(Pojo pojo) {
// todo
}
}
- 分散式冪等 檢查指定key是否已被操作,若已操作,跳過執行或丟擲指定異常,預設冪等預設保留10分鐘,適用於避免重複點選、支付、建立、MQ重複消費等
@Service
public class TestService {
@Idempotent(domain = "IdempotentTest", keys = {"#token"})
public void IdempotentTest(String token) {
// todo
}
}