异步结果编排的关键在于协调多个异步任务而非简单收集future对象;应使用completablefuture.allof、flux.merge/concat或flatmap等机制聚合结果,避免同步阻塞调用和未处理异常。

异步结果本身不是集合,Lettuce 中的 RedisFuture 或 Mono/Flux 也不直接“存入集合变量”来编排结果;真正需要编排的是对多个异步操作的协调与聚合——比如批量 GET、并行 SET、或按序处理一批 key 的响应。关键不在“把结果塞进 List”,而在如何合理调度、等待、组合这些异步任务。
异步命令返回值的本质不是集合
Lettuce 的异步接口(如 RedisAsyncCommands)每个方法都立即返回单个 RedisFuture<t></t>,例如:
set("k1", "v1") → RedisFuture<string></string>get("k2") → RedisFuture<string></string>-
mget("k1","k2","k3") → RedisFuture<list>></list>(这是 Redis 协议层面的批量命令,返回一个含多个值的 List,但仍是单个 Future)
它不自动把多次调用的结果“收集到一个集合里”。若你手动写 List<redisfuture>> futures = new ArrayList()</redisfuture>,那只是装了一堆未完成的任务句柄,不是结果集合。
真正有效的集合编排方式:组合多个异步任务
要让多个异步操作的结果形成有意义的集合结构(如统一等待、按 key 聚合、失败熔断),应使用 Lettuce + Java 并发工具或 Reactor 的组合能力:
- 用
CompletableFuture.allOf()等待全部完成,再从各 future 中join()取值,组装成 List/Map - 用
Flux.concat()/Flux.merge()将多个Mono<t></t>合并为Flux<t></t>,再collectList()得到Mono<list>></list> - 对 key 列表做
Flux.fromIterable(keys).flatMap(key → commands.get(key)),天然生成按请求顺序(或并发顺序)组织的响应流 - 用
Map<string mono>></string>存储 key→异步操作映射,最后Flux.fromMap()或Mono.zip()组合
避免常见误操作:别用同步方式“遍历 Future 集合”
以下写法是低效甚至阻塞的,违背异步初衷:
- 循环调用
future.get()—— 每次都阻塞线程,失去并发优势 - 把
RedisFuture直接放进List<object></object>然后试图序列化或打印 —— 实际输出是类似RedisFuture@abc123[not completed],毫无业务意义 - 未处理异常:某个
RedisFuture失败时,若没调用handle()或exceptionally(),会导致整个编排链路中断或静默丢弃
实用示例:批量读取并构建成 Map
假设有一组 key,希望异步并发读取,并最终得到 Map<string string></string>:
Flux.fromIterable(keys)<br> .flatMap(key → commands.get(key).map(value → Tuples.of(key, value)))<br> .collectMap(Tuple2::getT1, Tuple2::getT2)
这段代码会并发发起所有 GET 请求,收到响应后自动配对 key-value,最终返回 Mono<map>></map> —— 这才是对“集合中异步结果”的正确编排逻辑。











