分布式锁 MLock 应用介绍
分布式锁 MLock gitee 地址
分布式锁 MLock github 地址
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}
}