Redis 分布式锁
大约 2 分钟
基于 redisson + Spring 实现的分布式锁,redis 存储位置会自动读取 redis 工具类中的前缀,也就是说此工具类严格依赖 redis 工具类。
安装与配置
Maven 依赖
<dependency>
<groupId>com.simperfect.commons</groupId>
<artifactId>simperfect-dynamic-redis-lock</artifactId>
</dependency>
<!-- 分布式锁依赖 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
使用方式
RedisLock 注解类
基于 Spring AOP 实现的注解类,此注解只能用于 spring 项目,且只能在方法上使用。
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
key | String | defaultLock | 分布式锁 key,不用填写项目项目前缀 |
value | String | defaultLock | key 属性的别名,在不需要其他属性时使用 |
appendKey | String | "" | 在 key 的后面拼接 key,这里只能使用 Spring 表达式语言 (SpEL) 表达式。例如:获取方法的参数的值来作为 key 的后缀:
|
waitTime | int | 60 | 等待时间 单位(秒) |
leaseTime | int | 180 | 锁持续时间 单位(秒) |
范例:
// 最简单的基础适用
@RedisLock("example")
public void example() {
}
// 获取 `user` 参数中的属性值拼接
@RedisLock(key = "example", appendKey = "#user.id + \":\" + #user.name")
public void example(User user) {
}
// 使用 `taskId` 参数值拼接
@RedisLock(key = "example", appendKey = "#taskId")
public void example(Long taskId) {
}
RedisLockUtils 类
这是一个静态的工具类,需要将 Redisson 对象传入。这个类里面的 key 并不会进行拼接,传入什么就是什么,是一个基础的工具类。
范例:
@Resource
private Redisson redisson;
// 业务逻辑中没有返回值
public void example() {
// 这里的 key 需要传入完整的字符串
RedisLockUtils.tryLock(redisson, "sp:example:key", () -> {
// 业务逻辑
});
}
// 业务逻辑有返回值
public String example() {
// 这里的 key 需要传入完整的字符串
return RedisLockUtils.tryLock(redisson, "sp:example:key", () -> {
// 业务逻辑
return "success";
});
}
RedisLockHelper 类
这是 Redis 分布式锁 Spring Redisson 工具类,会将 redis key 进行前缀拼接(Namespace + RedisPrefix + tenantId + key
),以适用不同的租户。
支持传入一段逻辑,这段逻辑代码块中会自动加锁,执行完成后,会自动解锁。
范例:
@Resource
private RedisLockHelper redisLockHelper;
// 业务逻辑中没有返回值
public void example() {
// 这里直接传入业务锁的 key 即可,内部会自动拼接 `Namespace + RedisPrefix + tenantId + key`
redisLockHelper.tryLock("key", () -> {
// 业务逻辑
});
}
// 业务逻辑有返回值
public String example() {
// 这里直接传入业务锁的 key 即可,内部会自动拼接 `Namespace + RedisPrefix + tenantId + key`
return redisLockHelper.tryLock("key", () -> {
// 业务逻辑
return "success";
});
}