Redisson 常用方法介绍
- 分布式锁(RLock)相关方法
分布式锁是 Redisson 最核心的功能之一,支持可重入、自动续期等特性,常用于解决分布式环境下的资源竞争问题。
核心方法
-
lock()
:阻塞式获取锁,默认持有时间 30 秒(由看门狗自动续期)。 -
tryLock(long waitTime, long leaseTime, TimeUnit unit)
:尝试获取锁,最多等待waitTime
,获取成功后持有leaseTime
时长。 -
unlock()
:释放锁,需在finally
中调用,避免锁泄漏。 -
isHeldByCurrentThread()
:判断当前线程是否持有锁,用于安全释放。
代码示例
csharp
// 获取锁对象(锁名称通常关联业务ID,如"stock:1001")
RLock lock = redisson.getLock("order:create:1001");
try {
// 尝试获取锁:最多等待5秒,获取成功后持有10秒(10秒后自动释放)
boolean isLocked = lock.tryLock(5, 10, TimeUnit.SECONDS);
if (isLocked) {
// 执行业务逻辑(如创建订单、扣减库存)
System.out.println("获取锁成功,执行业务...");
} else {
System.out.println("获取锁失败,可能存在并发冲突");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 确保只有当前线程持有锁时才释放
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
- 分布式集合(RMap、RSet)相关方法
Redisson 提供了与 Java 标准集合 API 类似的分布式集合,支持跨节点共享数据。
核心方法(以 RMap 为例)
-
put(K key, V value)
:添加键值对,覆盖已有键。 -
putIfAbsent(K key, V value)
:原子性添加,仅当键不存在时生效。 -
get(Object key)
:获取键对应的值。 -
remove(Object key)
:删除键值对。
代码示例
csharp
// 获取分布式Map(用于存储商品库存)
RMap\<String, Integer> stockMap = redisson.getMap("product:stock");
// 添加库存(若键已存在则覆盖)
stockMap.put("apple", 1000);
// 原子性添加(仅当"banana"不存在时设置值)
stockMap.putIfAbsent("banana", 500);
// 获取库存
Integer appleStock = stockMap.get("apple");
System.out.println("苹果库存:" + appleStock);
// 扣减库存(实际场景需配合分布式锁使用)
stockMap.put("apple", appleStock - 10);
// 删除键
stockMap.remove("banana");
- 分布式同步工具(RSemaphore、RCountDownLatch)相关方法
Redisson 提供了分布式环境下的同步工具,用于协调多个线程或服务的执行流程。
3.1 信号量(RSemaphore)
用于控制并发访问资源的线程数量,类似 "限流" 功能。
-
acquire()
:获取许可,若无可用许可则阻塞。 -
release()
:释放许可,供其他线程使用。 -
trySetPermits(int permits)
:初始化许可数量。
代码示例
scss
// 获取信号量(控制最多5个并发请求)
RSemaphore semaphore = redisson.getSemaphore("api:limit");
semaphore.trySetPermits(5); // 初始化5个许可
try {
// 获取许可(若许可用尽,会阻塞等待)
semaphore.acquire();
// 执行受限操作(如调用第三方接口)
System.out.println("执行接口调用...");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 释放许可,供其他线程使用
semaphore.release();
}
3.2 闭锁(RCountDownLatch)
用于等待多个线程完成任务后再执行后续操作,支持跨服务协调。
-
trySetCount(long count)
:设置初始计数。 -
countDown()
:计数减 1。 -
await()
:阻塞等待,直到计数为 0。
代码示例
scss
// 获取闭锁(等待3个初始化任务完成)
RCountDownLatch latch = redisson.getCountDownLatch("system:init");
latch.trySetCount(3); // 初始计数为3
// 模拟3个初始化线程
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
// 执行初始化任务(如加载配置、缓存预热)
System.out.println("执行初始化任务...");
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 任务完成,计数减1
latch.countDown();
}
}).start();
}
// 主线程等待所有初始化完成
try {
latch.await(); // 阻塞直到计数为0
System.out.println("所有初始化任务完成,系统启动!");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}