Redisson 分布式锁
时间: 2025-06-02 22:11:34 浏览: 34
### Redisson 分布式锁使用教程及示例代码
Redisson 是一个用于 Redis 的 Java 客户端,提供了多种分布式对象和工具,其中包括分布式锁。以下是 Redisson 实现分布式锁的详细信息和代码示例。
#### 1. 添加依赖
在使用 Redisson 前,需要在项目中添加 Maven 或 Gradle 依赖。
```xml
<!-- Maven -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.20.0</version>
</dependency>
```
```gradle
// Gradle
implementation 'org.redisson:redisson:3.20.0'
```
#### 2. 配置 Redisson 客户端
创建 Redisson 客户端实例,连接到 Redis 服务器。
```java
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");
return Redisson.create(config);
}
}
```
#### 3. 使用分布式锁
Redisson 提供了多种类型的分布式锁,包括 `RLock`、`FairLock` 和 `RedLock` 等。以下是一个简单的分布式锁使用示例。
##### 示例代码:基于 RLock 的分布式锁
```java
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
public class DistributedLockExample {
private static final RedissonClient redissonClient = RedissonConfig.getClient();
public static void main(String[] args) throws InterruptedException {
String lockKey = "product:001";
RLock lock = redissonClient.getLock(lockKey);
try {
// 尝试获取锁,等待时间最长为 10 秒,锁持有时间为 30 秒
boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);
if (isLocked) {
System.out.println("锁已获取,执行业务逻辑...");
// 模拟业务逻辑处理
Thread.sleep(5000);
} else {
System.out.println("未能获取锁!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放锁
if (lock.isHeldByCurrentThread()) {
lock.unlock();
System.out.println("锁已释放!");
}
}
}
}
```
#### 4. 公平锁(Fair Lock)
公平锁确保线程按照请求锁的顺序获取锁,避免饥饿问题。
```java
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
public class FairLockExample {
private static final RedissonClient redissonClient = RedissonConfig.getClient();
public static void main(String[] args) throws InterruptedException {
String lockKey = "fair-lock";
RLock fairLock = redissonClient.getFairLock(lockKey);
try {
fairLock.lock();
System.out.println("公平锁已获取,执行业务逻辑...");
Thread.sleep(5000);
} finally {
fairLock.unlock();
System.out.println("公平锁已释放!");
}
}
}
```
#### 5. 红锁(RedLock)
红锁是一种更复杂的分布式锁实现,适用于跨多个 Redis 实例的场景。
```java
import org.redisson.RedissonRedLock;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
public class RedLockExample {
private static final RedissonClient redissonClient1 = RedissonConfig.getClient();
private static final RedissonClient redissonClient2 = RedissonConfig.getClient();
public static void main(String[] args) throws InterruptedException {
RLock lock1 = redissonClient1.getLock("red-lock");
RLock lock2 = redissonClient2.getLock("red-lock");
RedissonRedLock redLock = new RedissonRedLock(lock1, lock2);
try {
redLock.lock();
System.out.println("红锁已获取,执行业务逻辑...");
Thread.sleep(5000);
} finally {
redLock.unlock();
System.out.println("红锁已释放!");
}
}
}
```
### 注意事项
- 在实际应用中,建议设置合理的锁等待时间和锁持有时间,以避免死锁或锁超时[^1]。
- 分布式锁的释放必须在 `finally` 块中进行,确保无论是否发生异常都能正确释放锁[^2]。
- 如果业务逻辑复杂且耗时较长,可以考虑使用可重入锁或尝试锁机制。
阅读全文
相关推荐

















