redis可以使用分布式锁的场景,redisson封装了该部分内容,下面看看怎么使用
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class RedisUtils {
private static RedissonClient REDISSON_CLIENT;
public RedisUtils(@Autowired RedissonClient redissonClient) {
REDISSON_CLIENT = redissonClient;
}
/**
* 尝试获取锁
*
* @param key 锁key
* @param waitTime 最多等待时间,0:表示不等待,只尝试加锁一次
* @param leaseTime 上锁后自动释放锁时间,-1:表示不自动释放锁
* @return 获取锁成功返回true 失败返回false
*/
public static boolean tryLock(String key, long waitTime, long leaseTime) {
RLock lock = REDISSON_CLIENT.getLock(key);
try {
return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
} catch (InterruptedException e) {
return false;
}
}
public static void unlock(String key) {
RLock lock = REDISSON_CLIENT.getLock(key);
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
} else {
log.warn("redis锁已超时释放");
}
}
}
java
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class RedisUtils {
private static RedissonClient REDISSON_CLIENT;
public RedisUtils(@Autowired RedissonClient redissonClient) {
REDISSON_CLIENT = redissonClient;
}
/**
* 尝试获取锁
*
* @param key 锁key
* @param waitTime 最多等待时间,0:表示不等待,只尝试加锁一次
* @param leaseTime 上锁后自动释放锁时间,-1:表示不自动释放锁
* @return 获取锁成功返回true 失败返回false
*/
public static boolean tryLock(String key, long waitTime, long leaseTime) {
RLock lock = REDISSON_CLIENT.getLock(key);
try {
return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
} catch (InterruptedException e) {
return false;
}
}
public static void unlock(String key) {
RLock lock = REDISSON_CLIENT.getLock(key);
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
} else {
log.warn("redis锁已超时释放");
}
}
}
