分散式鎖(5)-MLock使用介紹(自己實現,基於redis,適用於真實專案)

莫小點還有救 發表於 2021-10-16
Redis

分散式鎖 MLock 使用介紹

分散式鎖 MLock gitee地址
分散式鎖 MLock github地址

系列文章連結:

1.基於

使用java+redis實現了常用的分散式鎖,提供註解、程式碼兩種使用形式,方便簡單

2.特性

  1. 支援分散式鎖
  2. 支援分散式檢查鎖
  3. 支援分散式冪等
  4. 支援註解用法和模板用法
  5. 支援自動續約

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 使用

  1. 分散式鎖 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 
    }
}
  1. 模板用法
@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;
                    }
                }
        );
    }
}
  1. 分散式檢查鎖 檢查鎖的存在,不加鎖,若已加鎖,跳過執行或丟擲指定異常
@Service
public class TestService {
    @CheckLock(domain = "checkLockTest", keys = {"#pojo.id"}, lockType = LockTypeEnum.LOCK_REDIS_FORCE)
    public void checkLockTest(Pojo pojo) {
        // todo 
    }
}
  1. 分散式冪等 檢查指定key是否已被操作,若已操作,跳過執行或丟擲指定異常,預設冪等預設保留10分鐘,適用於避免重複點選、支付、建立、MQ重複消費等
@Service
public class TestService {
    @Idempotent(domain = "IdempotentTest", keys = {"#token"})
    public void IdempotentTest(String token) {
        // todo
    }
}