0

0

Quarkus Reactive Redis 中高效批量获取匹配键的值

碧海醫心

碧海醫心

发布时间:2026-03-08 17:18:02

|

904人浏览过

|

来源于php中文网

原创

Quarkus Reactive Redis 中高效批量获取匹配键的值

本文详解如何在 Quarkus 的响应式 Redis 客户端中,安全、非阻塞地实现「通配符查键 → 并行取值 → 汇总列表」的完整链路,规避 await().indefinitely() 导致的线程阻塞错误。

本文详解如何在 quarkus 的响应式 redis 客户端中,安全、非阻塞地实现「通配符查键 → 并行取值 → 汇总列表」的完整链路,规避 `await().indefinitely()` 导致的线程阻塞错误。

在 Quarkus 响应式编程模型中,所有 I/O 操作(包括 Redis 访问)必须严格遵循非阻塞原则。你遇到的 The current thread cannot be blocked: vert.x-eventloop-thread-2 错误,根源在于:在 Vert.x 事件循环线程上调用了同步阻塞操作 await().indefinitely()——这直接违反了响应式流的设计契约,会导致应用吞吐量骤降甚至线程饥饿。

正确做法是全程保持响应式链路畅通,利用 Mutiny 的 Uni 和 Multi 类型进行声明式编排。以下是推荐的实现方案:

ChatTTS
ChatTTS

ChatTTS是一个开源的TTS文本转语音生成模型,专为对话场景设计。

下载

✅ 正确的响应式实现(推荐)

@ApplicationScoped
public class PromotionService {

    private final ReactiveKeyCommands<String> keys;
    private final ReactiveValueCommands<String, Promotion> values;

    public PromotionService(ReactiveRedisDataSource reactiveRedisDataSource) {
        // 复用命令对象,避免重复创建开销
        this.keys = reactiveRedisDataSource.key();
        this.values = reactiveRedisDataSource.value(String.class, Promotion.class);
    }

    public Uni<List<Promotion>> listAll() {
        return keys.keys("promo*")                      // Uni<List<String>> —— 匹配的所有键
                .onItem().transformToMulti(keysList -> 
                    Multi.createFrom().items(keysList)) // Multi<String> —— 转为异步流
                .onItem().transformToUniAndMerge(values::get) // Multi<Promotion> —— 并发获取每个键对应的 Promotion
                .collect().asList();                        // Uni<List<Promotion>> —— 收集全部结果
    }
}

? 关键设计解析

  • transformToMulti(...):将 Uni> 转换为 Multi,使后续操作能以流式方式逐个处理键,而非一次性加载全部键到内存再遍历(更符合响应式内存友好原则)。
  • transformToUniAndMerge(...):对每个键并发发起 GET 请求,充分利用 Redis 连接池与网络并行能力;若需严格保序(如按 key 字典序返回),请替换为 transformToUniAndConcatenate(...)。
  • collect().asList():自动等待所有 Promotion 流项完成,并聚合为最终 Uni>,语义清晰且线程安全。

⚠️ 注意事项与最佳实践

  • ❌ 禁止在事件循环线程中使用任何 .await()、.toCompletableFuture().join() 或 Thread.sleep();
  • ✅ 优先复用 ReactiveKeyCommands 和 ReactiveValueCommands 实例(如上例通过构造器注入),避免高频重建命令对象带来的 GC 压力;
  • ? 若匹配键数量极大(如数万级),建议配合分页或游标(scan)替代 keys(keys 在生产环境慎用,可能阻塞 Redis 主线程);
  • ? 可添加空值过滤:在 transformToUniAndMerge 后追加 .onItem().filter(Objects::nonNull),避免 null 值混入结果列表。

该方案完全契合 Quarkus + Mutiny + Redis 的响应式栈,兼具性能、可读性与可维护性,是构建高并发、低延迟数据服务的标准实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

253

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

438

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

99

2025.12.01

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号