主题
分布式锁工具
基于redis实现的分布式锁服务,可以通过注解或者工具类方式使用。
全局配置
分布式锁默认配置信息
yaml
wueasy:
lock:
max-expire: 30s #最大过期时间,默认30秒,0 永不过期
acquire-timeout: 30s #获取锁超时时间,默认30秒。设置为0一直等待
注解使用
通过注解
@Lock
快速实现分布式锁。
参数说明
锁的key支持spel表达式,只能使用索引方式匹配参数,例如:
#p0.accountNo
匹配第一个参数对象中accountNo字段,使用#p参数索引位置
匹配参数对象
group
:锁的分组(用于区分业务),默认为“方法名称”keys
:锁的keymaxExpire
:最大过期时间,单位毫秒,设置为0永不过期,默认为“全局配置”acquireTimeout
:获取锁超时时间,单位毫秒,设置为0一直等待,默认为“全局配置”msg
:自定义获取锁失败的错误消息,默认“请求超时,请重试”
使用示例
java
@PostMapping(value = "/login", produces = MediaType.APPLICATION_JSON_VALUE)
@Lock(keys = "#p0.accountNo")
public Mono<ResultVo<SessionVo>> login(@RequestBody @Valid LoginDto dto) {
return Mono.just(ResultVo.ok(loginService.login(dto)));
}
工具类使用
如果不想使用注解方式,可以使用工具类方式,工具类
RedisDistributedLock
方法说明
java
/**
* 获取锁
* @author: fallsea
* @param lockKey 锁key
* @param maxExpire 最大过期时间
* @param acquireTimeout 获取锁超时时间,设置为0一直等待
* @return true 获取成功,false 获取失败
*/
boolean lock(String lockKey,Duration maxExpire,Duration acquireTimeout);
/**
* 获取锁
* @author: fallsea
* @param lockKey 锁key
* @param maxExpire 最大过期时间
* @return true 获取成功,false 获取失败
*/
boolean lock(String lockKey,Duration maxExpire);
/**
* 获取锁
* @author: fallsea
* @param lockKey 锁key
* @return true 获取成功,false 获取失败
*/
boolean lock(String lockKey);
/**
* 立即获取锁
* @author: fallsea
* @param lockKey 锁key
* @return true 获取成功,false 获取失败
*/
boolean tryLock(String lockKey);
/**
* 立即获取锁
* @author: fallsea
* @param lockKey 锁key
* @param maxExpire 最大过期时间
* @return true 获取成功,false 获取失败
*/
boolean tryLock(String lockKey,Duration maxExpire);
/**
* 释放锁
* @author: fallsea
* @param lockKey 锁key
* @param lockValue 锁唯一编码
* @return true 成功,false 失败
*/
boolean unlock(String lockKey);
使用示例
WARNING
一定要释放锁
java
@Autowired
private RedisDistributedLock redisDistributedLock;
String lockKey = "demo";
//获取锁
boolean b = redisDistributedLock.lock(lockKey, Duration.ofSeconds(30), Duration.ofSeconds(30));
try {
//TODO 业务代码
}finally {
if(b) {
//释放锁
redisDistributedLock.unlock(lockKey);
}
}