环境
Java 11
前言
笔记:记录代码上如何使用分布式锁;
Lock和TryLock的区别
1: lock拿不到锁会一直等待。tryLock是去尝试,拿不到就返回false,拿到返回true。
2: tryLock是可以被打断的,被中断 的,lock是不可以。
代码
public static final String SEND_COUPON_STRATEGY_LOCK_PREFIX = "send_coupon_strategy_";
String key = SEND_COUPON_STRATEGY_LOCK_PREFIX + dto.getStrategyId();
// 获取到锁对象,其是一个可重入锁
RLock lock = redissonClient.getLock(key);
// 尝试加锁
tryLock(lock, key, tryLockWaitTime);
try {
// 业务逻辑
return couponCreatingService.create(dto, createNumber);
} finally {
lock.unlock();
}
上面tryLock()
方法:
/**
* 加锁
*
* @param lock 锁
* @param key 加锁的key
* @param waitTime 等待时间 单位s
*/
private void tryLock(RLock lock, String key, Integer waitTime) {
boolean haveLock;
try {
log.info("尝试获取锁,key:", ImmutableMap.of("key", key));
haveLock = lock.tryLock(waitTime, TimeUnit.SECONDS);
log.info("获取锁结束,key:", ImmutableMap.of("key", key, "result", haveLock));
} catch (InterruptedException e) {
log.error("获取锁异常", e);
throw new DomainException(STRAETEGY_LOCK_ACQ_ERROR);
}
if (!haveLock) {
throw new DomainException(STRAETEGY_GET_LOCK_FAILED);
}
}
DomainException 公司封装的异常,不用管;
Redisson的MultiLock和RedLock 区别?
个人理解:
因为RedLock就是MultiLock的子类,所以其实红锁就是基于联锁来实现的,
因此大部分的逻辑都类似;
区别:
RedLock,不需要全部加锁成功,大部分加锁成功就可以;而MultiLock要求全部加锁成功。