redisson
是Redis
官方推荐的分布式锁实现,其核心原理如下:
- 看门狗机制 :默认情况下,未指定
leaseTime
时,Redisson
会启动看门狗线程自动续期锁(默认30
秒续一次); - 锁超时释放 :若指定
leaseTime
,锁将在固定时间后自动释放(不触发看门狗); - 可重入 锁 :同一线程可重复获取锁(锁计数器+
1
),需对应次数的解锁操作; - 公平锁 :通过
getFairLock()
可创建公平锁,按请求顺序分配锁;
使用方式:
- 引入依赖
xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.7</version> <!-- 使用最新版本 -->
</dependency>
- 配置类
arduino
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonConfig {
public static RedissonClient getClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379") // Redis地址
.setPassword("your_password") // 密码(可选)
.setDatabase(0); // 数据库编号
return Redisson.create(config);
}
}
- 工具类
java
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import java.util.concurrent.TimeUnit;
public class DistributedLockUtil {
private static final RedissonClient redissonClient = RedissonConfig.getClient();
// 获取锁
public static RLock getLock(String lockKey) {
return redissonClient.getLock(lockKey);
}
// 尝试加锁(推荐使用)
public static boolean tryLock(RLock lock, long waitTime, long leaseTime, TimeUnit unit) {
try {
return lock.tryLock(waitTime, leaseTime, unit);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
}
// 释放锁
public static void unlock(RLock lock) {
if (lock != null && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
- 业务代码中的使用
java
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;
public class OrderService {
public void createOrder(String orderId) {
RLock lock = DistributedLockUtil.getLock("LOCK_ORDER:" + orderId);
try {
// 尝试获取锁:最多等待2秒,锁持有时间30秒(自动续期由看门狗机制处理)
boolean isLocked = DistributedLockUtil.tryLock(lock, 2, 30, TimeUnit.SECONDS);
if (isLocked) {
// 执行业务逻辑(如防止重复下单)
System.out.println("执行业务操作...");
} else {
throw new RuntimeException("获取锁失败,请重试");
}
} finally {
DistributedLockUtil.unlock(lock); // 确保释放锁
}
}
}