详细学习一下 Redisson 的 `RFuture`

一篇从 源码到实战 的完整笔记 版本:Redisson 3.23.4 + JDK 17


目录

  1. 前言

  2. RFuture 是什么

  3. 类图与继承体系

  4. 生命周期 & 状态流转

  5. 四种典型用法

    1. 同步阻塞 get()
    2. 异步回调 whenComplete()
    3. 链式组合 thenCompose()
    4. 批量等待 CompletableFuture.allOf()
  6. 与 JDK Future 的差异

  7. 线程模型与调度器

  8. 常见陷阱 & 最佳实践

  9. 性能调优

  10. 总结


前言

在 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 异步世界的钥匙!
相关推荐
行百里er3 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
高频因子挖掘机4 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
孟健5 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
码事漫谈5 小时前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端
迪飞特科技5 小时前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑6 小时前
@JsonInclude注解使用
spring boot·后端·spring
IT_陈寒6 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信6 小时前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端
CCblandy6 小时前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
蜗牛互联网6 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python