乐趣区

关于java:分布式锁-MLock-使用介绍

分布式锁 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}
}
退出移动版