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

发布于:2025-07-08 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、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 ver
      LIMIT 0 10
      DIALECT 3
    
    • 不要使用 LOAD * 或者默认返回,会导致索引无法覆盖,CPU 额外读取内存。
  2. 限制结果集大小
    使用 LIMIT offset count 限制返回条数,避免一次性扫描过多文档。

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

五、性能对比示例

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

1. 向量检索(Vector)

Shards Threads/shard CPUs 吞吐速率提升
1 0 1 baseline
6 0 6 ×6.6
1 6 6 ×2.5
2 6 12 ×6.1
4 6 24 ×24.3

2. 标签检索(Tag)

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

3. 全文检索(Text)

  • 两词并(Union)查询

    Threads QPS 提升
    0 188 baseline
    6 1,072 +470%
    12 1,995 +961%
    18 2,834 +1,407%
  • 两词交(Intersection)查询

    Threads QPS 提升
    0 2,373 baseline
    6 12,396 +422%
    12 17,506 +638%
    18 19,764 +733%
  • 单词精确匹配

    Threads QPS 提升
    0 476 baseline
    6 2,837 +496%
    12 5,292 +1,012%
    18 7,512 +1,478%

4. 数值查询(Numeric)

Threads QPS 提升
0 33,584 baseline
1 36,993 +10.2%
3 36,504 +8.7%
6 36,897 +9.9%

5. 地理查询(Geo)

  • 未使用 UNF(范式化)

    Threads QPS 提升
    0 48
    6 96 +100%
    12 96 +100%
    18 98 +104%
  • 使用 UNF(关闭范式化)

    Threads QPS 提升
    0 61
    6 227 +272%
    12 217 +256%
    18 217 +256%

六、实战建议

  1. 分阶段调优

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

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

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

七、总结

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


网站公告

今日签到

点亮在社区的每一天
去签到