Redis锁工具类
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
* redisson 分布式工具类
*/
@Component
public class RedisDistributedHelper {
private static final Logger logger = LoggerFactory.getLogger(RedisDistributedHelper.class);
private static final long DEFAULT_WAIT_TIME = 20;
private static final long DEFAULT_TIMEOUT = 5;
private static final TimeUnit DEFAULT_TIME_UNIT = TimeUnit.SECONDS;
@Resource
private RedissonClient redissonClient;
/**
* 加锁
*
* @param lockKey
*/
public void lock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(DEFAULT_TIMEOUT, DEFAULT_TIME_UNIT);
}
/**
* 带过期时间的锁
*
* @param lockKey key
* @param leaseTime 上锁后自动释放锁时间
*/
public void lock(String lockKey, long leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(leaseTime, DEFAULT_TIME_UNIT);
}
/**
* 带超时时间的锁
*
* @param lockKey key
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间单位
*/
public void lock(String lockKey, long leaseTime, TimeUnit unit) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(leaseTime, unit);
}
/**
* 尝试获取锁
*
* @param lockKey key
* @return
*/
public boolean tryLock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(DEFAULT_WAIT_TIME, DEFAULT_TIMEOUT, DEFAULT_TIME_UNIT);
} catch (InterruptedException e) {
logger.error("RedissonUtils - tryLock异常", e);
}
return false;
}
/**
* 尝试获取锁
*
* @param lockKey key
* @param waitTime 最多等待时间
* @param leaseTime 上锁后自动释放锁时间
* @return boolean
*/
public boolean tryLock(String lockKey, long waitTime, long leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, DEFAULT_TIME_UNIT);
} catch (InterruptedException e) {
logger.error("RedissonUtils - tryLock异常", e);
}
return false;
}
/**
* 尝试获取锁
*
* @param lockKey key
* @param waitTime 最多等待时间
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间单位
* @return boolean
*/
public boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, unit);
} catch (InterruptedException e) {
logger.error("RedissonUtils - tryLock异常", e);
}
return false;
}
/**
* 释放锁
*
* @param lockKey key
*/
public void unlockAfterCommit(String lockKey) {
// 是否开启事务判断
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
logger.info("事务提交成功后释放锁:lockKey:{}", lockKey);
unlock(lockKey);
}
});
} else {
logger.info("没有开启事务直接释放锁:lockKey:{}", lockKey);
unlock(lockKey);
}
}
/**
* 释放锁
*
* @param lockKey key
*/
public void unlock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.unlock();
}
/**
* 是否存在锁
*
* @param lockKey key
* @return
*/
public boolean isLocked(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
return lock.isLocked();
}
}