一篇从 源码到实战 的完整笔记 版本:Redisson 3.23.4 + JDK 17
目录
-
前言
-
RFuture 是什么
-
类图与继承体系
-
生命周期 & 状态流转
-
四种典型用法
- 同步阻塞
get() - 异步回调
whenComplete() - 链式组合
thenCompose() - 批量等待
CompletableFuture.allOf()
- 同步阻塞
-
与 JDK Future 的差异
-
线程模型与调度器
-
常见陷阱 & 最佳实践
-
性能调优
-
总结
前言
在 Redisson 里,所有异步 API (RBucketAsync, RLockAsync, RMapAsync...) 都返回 RFuture<T>。 理解它 = 理解 Redisson 异步编程的全部乐趣。
RFuture 是什么
表格
复制
| 维度 | 描述 |
|---|---|
| 定义 | public interface RFuture<V> extends CompletionStage<V>, Future<V> |
| 作用 | 统一异步结果容器,屏蔽 Netty 与 JDK Future 差异 |
| 实现 | RedissonPromise (内部继承 Netty DefaultPromise) |
类图与继承体系

生命周期 & 状态流转
表格
复制
| 状态 | 含义 |
|---|---|
| UNSUCCESS | 未完成 |
| SUCCESS | 正常完成 |
| FAILURE | 异常完成 |
java
复制
arduino
enum PromiseState { UNSUCCESS, SUCCESS, FAILURE }
四种典型用法
1. 同步阻塞 get()
java
复制
ini
RFuture<String> f = bucket.getAsync();
String value = f.get(3, TimeUnit.SECONDS);
2. 异步回调 whenComplete
java
复制
lua
f.whenComplete((r, e) -> {
if (e == null) {
log.info("value: {}", r);
} else {
log.error("error", e);
}
});
3. 链式组合 thenCompose
java
复制
less
bucket.setAsync("A")
.thenCompose(v -> bucket.getAsync())
.thenAccept(System.out::println);
4. 批量等待
java
复制
vbscript
List<RFuture<?>> batch = List.of(
bucket.setAsync("a"),
map.putAsync("k", "v")
);
CompletableFuture.allOf(batch.toArray(new CompletableFuture[0])).join();
与 JDK Future 的差异
表格
复制
| 特性 | RFuture | JDK Future |
|---|---|---|
| 回调注册 | addListener() |
❌ |
| 链式 API | thenCompose() |
❌ |
| 超时 | await(timeout) |
✅ |
| 取消 | cancel(true) |
✅ |
| 异常携带 | cause() |
get() 抛出 |
线程模型与调度器
- 内部线程 :Redisson 的
ExecutorService(默认ForkJoinPool.commonPool()) - 回调线程:Netty EventLoop 或业务线程
- 线程切换 :
thenRunAsync(executor)显式指定
常见陷阱 & 最佳实践
表格
复制
| 陷阱 | 解决 |
|---|---|
| 回调阻塞 | 耗时任务转业务线程 |
| 内存泄漏 | ByteBuf 需要 release() |
| 死循环 | 避免在回调里再次同步等待 |
性能调优
表格
复制
| 配置 | 建议 |
|---|---|
| 线程池 | redisson.executor = customExecutor |
| 连接池 | redisson.nettyThreads = 0 |
| 超时 | RFuture.get(timeout) |
总结
- RFuture = Netty Promise + JDK CompletionStage
- 三步走:注册 → 完成 → 回调
- 一句话 :掌握
RFuture,就掌握了 Redisson 异步世界的钥匙!