当前位置: 首页 > news >正文

可扩展 Redis 查询引擎的最佳实践

一、Query Performance Factor 概述

  • 定义:Query Performance Factor 指定 Redis Query Engine 在执行单个查询时可用的 CPU 核心数(即 worker 线程数)。
  • 作用:查询引擎内部会将检索和排序等计算任务拆分到多个线程并行执行。
  • 目标:利用更多 CPU 资源来增加查询吞吐,减少单次查询延迟。

Redis Cloud 和最新版本的 Redis 自托管均支持通过配置参数 NUMTHREADS(或云端 UI 中的“查询性能因子”滑块)调整查询线程数。

二、最佳使用场景

Query Performance Factor 对以下情况效益显著:

  1. 查询类型

    • Full-text:基于词项倒排索引的全文检索
    • Tag:枚举型标签过滤
    • Vector:向量相似度检索
    • Numeric:数值范围查询或排序
    • Geo:基于经纬度的空间查询
  2. 结果集规模

    • 小规模返回(如分页前几条)
    • 文档子集以原始(非范式化)形式被索引

对于需要扫描大量文档或全量聚合(返回数十万级别结果),Query Performance Factor 的效果会受到网络和内存带宽等瓶颈制约,收益相对有限。

三、索引优化最佳实践

要让 Query Performance Factor 发挥最大的水平扩展能力,索引设计必须遵循以下原则:

优化项建议
返回字段对所有需要在 RETURN/LOAD 中输出的字段,务必加上 SORTABLE
TAG/GEO 字段使用 TAG … UNFGEO … UNF,关闭范式化(UNF:un-faceted)
TEXT 字段使用 TEXT NOSTEM,避免词干化带来的额外开销
NUMERIC 字段标记 NUMERIC SORTABLE,以支持并行范围扫描和排序

示例:从反模式到优化

# 反模式索引(缺少 SORTABLE、UNF、NOSTEM)
FT.CREATE jsonidx:profiles ON JSON PREFIX 1 profiles:SCHEMA $.tags.*   AS t     NUMERIC SORTABLE$.firstName AS name TEXT$.location  AS loc  GEO# 优化后索引
FT.CREATE jsonidx:profiles ON JSON PREFIX 1 profiles:SCHEMA $.tags.*    AS t        NUMERIC SORTABLE$.firstName  AS name     TEXT    NOSTEM SORTABLE$.lastName   AS lastname TEXT    NOSTEM SORTABLE$.location   AS loc      GEO     SORTABLE UNF$.id         AS id       TAG     SORTABLE UNF$.ver        AS ver      TAG     SORTABLE UNF

四、查询优化最佳实践

  1. 显式返回所需字段

    FT.AGGREGATE jsonidx:profiles '@t:[1299 1299]'LOAD 6 id t name lastname loc verLIMIT 0 10DIALECT 3
    
    • 不要使用 LOAD * 或者默认返回,会导致索引无法覆盖,CPU 额外读取内存。
  2. 限制结果集大小
    使用 LIMIT offset count 限制返回条数,避免一次性扫描过多文档。

  3. 使用高级 DSL
    针对 JSON 索引,推荐使用 DIALECT 3 及以上,以获得更优执行计划和并行度。

五、性能对比示例

以下实验在单节点(不同 CPU 数)环境中,分别测试了不同查询类型在开启多线程前后的性能增益。

1. 向量检索(Vector)

ShardsThreads/shardCPUs吞吐速率提升
101baseline
606×6.6
166×2.5
2612×6.1
4624×24.3

2. 标签检索(Tag)

Worker Threads查询 QPS 提升
0baseline
6+135.9%

3. 全文检索(Text)

  • 两词并(Union)查询

    ThreadsQPS提升
    0188baseline
    61,072+470%
    121,995+961%
    182,834+1,407%
  • 两词交(Intersection)查询

    ThreadsQPS提升
    02,373baseline
    612,396+422%
    1217,506+638%
    1819,764+733%
  • 单词精确匹配

    ThreadsQPS提升
    0476baseline
    62,837+496%
    125,292+1,012%
    187,512+1,478%

4. 数值查询(Numeric)

ThreadsQPS提升
033,584baseline
136,993+10.2%
336,504+8.7%
636,897+9.9%

5. 地理查询(Geo)

  • 未使用 UNF(范式化)

    ThreadsQPS提升
    048
    696+100%
    1296+100%
    1898+104%
  • 使用 UNF(关闭范式化)

    ThreadsQPS提升
    061
    6227+272%
    12217+256%
    18217+256%

六、实战建议

  1. 分阶段调优

    • 做好索引覆盖和字段标记(SORTABLE、UNF、NOSTEM);
    • 逐步增加查询线程数,观察 QPS 和延迟曲线;
    • 最后结合监控(CPU、内存、网络)找到最佳平衡点。
  2. 监控与告警

    • 使用 Redis 内置的 INFOLATENCY 以及云监控面板,跟踪单条查询延迟分布,确保没有“长尾”查询。
    • 配置告警:当 QPS 偏离预期或出现延迟飙升时,及时调整线程数或优化索引。
  3. 硬件与集群

    • 在单节点多核场景中,Query Performance Factor 带来显著性能;
    • 对超大规模部署,也可结合 Redis Cluster 做水平切分,将不同数据分片分配到多台机器。

七、总结

通过合理设计索引、精简查询和灵活配置查询线程,您可以在 Redis Software 或 Redis Cloud 环境中,实现接近线性甚至超线性的查询加速。本篇博客提供了从原理到实战的全面指导,助您在多核时代下,充分发挥 Redis Query Engine 的强大性能,为海量数据检索保驾护航。

http://www.lryc.cn/news/582134.html

相关文章:

  • 人工智能-基础篇-22-什么是智能体Agent?(具备主动执行和调优的人工智能产物)
  • DejaOS常见问题
  • (4)ROS2:moveit2的几个坑
  • 多通道采发仪VS系列 智能监测终端 工业级采发仪精准守护隧道边坡、水利大坝
  • 【Echarts】“折线+柱状”实现双图表-家庭用电量可视化【文章附完整代码】
  • 【SigNoz部署安装】Ubuntu环境部署SigNoz:Docker容器化监控的全流程指南
  • 御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
  • HTTP 重定向
  • Camera相机人脸识别系列专题分析之十六:人脸特征检测FFD算法之libcvface_api.so数据结构详细注释解析
  • C++ -- string类的模拟实现
  • Day07- 管理并发和并行挑战:竞争条件和死锁
  • 【AI大模型入门指南】机器学习入门详解
  • 烟雾,火焰探测器
  • Linux操作系统:软硬链接与动静态库
  • ClickHouse介绍与应用
  • 迁移GitLab,在新Linux中用Docker重新部署GitLab备份还原
  • C#中的BindingList有什么作用?
  • 【机器学习深度学习】多分类评估策略:混淆矩阵计算场景模拟示例
  • 亚马逊运营进阶指南:如何用AI工具赋能广告运营
  • 诊断工程师进阶篇 --- 车载诊断怎么与时俱进?
  • English Practice - Day 2
  • vite打包的简单配置
  • react状态管理库 - zustand
  • 风电自动化发电中的通信桥梁:CAN主站转MODBUS TCP网关解析
  • 【MyBatis】MyBatis与Spring和Spring Boot整合原理
  • 5种方法将联系人从iPhone转移到OnePlus
  • C++--map和set的使用
  • 仿mudou库one thread oneloop式并发服务器
  • 达梦数据库的信息查询
  • Redisson 分布式锁原理解析