可扩展 Redis 查询引擎的最佳实践
一、Query Performance Factor 概述
- 定义:Query Performance Factor 指定 Redis Query Engine 在执行单个查询时可用的 CPU 核心数(即 worker 线程数)。
- 作用:查询引擎内部会将检索和排序等计算任务拆分到多个线程并行执行。
- 目标:利用更多 CPU 资源来增加查询吞吐,减少单次查询延迟。
Redis Cloud 和最新版本的 Redis 自托管均支持通过配置参数 NUMTHREADS
(或云端 UI 中的“查询性能因子”滑块)调整查询线程数。
二、最佳使用场景
Query Performance Factor 对以下情况效益显著:
-
查询类型
- Full-text:基于词项倒排索引的全文检索
- Tag:枚举型标签过滤
- Vector:向量相似度检索
- Numeric:数值范围查询或排序
- Geo:基于经纬度的空间查询
-
结果集规模
- 小规模返回(如分页前几条)
- 文档子集以原始(非范式化)形式被索引
对于需要扫描大量文档或全量聚合(返回数十万级别结果),Query Performance Factor 的效果会受到网络和内存带宽等瓶颈制约,收益相对有限。
三、索引优化最佳实践
要让 Query Performance Factor 发挥最大的水平扩展能力,索引设计必须遵循以下原则:
优化项 | 建议 |
---|---|
返回字段 | 对所有需要在 RETURN/LOAD 中输出的字段,务必加上 SORTABLE |
TAG/GEO 字段 | 使用 TAG … UNF 或 GEO … 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
四、查询优化最佳实践
-
显式返回所需字段
FT.AGGREGATE jsonidx:profiles '@t:[1299 1299]'LOAD 6 id t name lastname loc verLIMIT 0 10DIALECT 3
- 不要使用
LOAD *
或者默认返回,会导致索引无法覆盖,CPU 额外读取内存。
- 不要使用
-
限制结果集大小
使用LIMIT offset count
限制返回条数,避免一次性扫描过多文档。 -
使用高级 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%
六、实战建议
-
分阶段调优
- 先做好索引覆盖和字段标记(SORTABLE、UNF、NOSTEM);
- 再逐步增加查询线程数,观察 QPS 和延迟曲线;
- 最后结合监控(CPU、内存、网络)找到最佳平衡点。
-
监控与告警
- 使用 Redis 内置的
INFO
、LATENCY
以及云监控面板,跟踪单条查询延迟分布,确保没有“长尾”查询。 - 配置告警:当 QPS 偏离预期或出现延迟飙升时,及时调整线程数或优化索引。
- 使用 Redis 内置的
-
硬件与集群
- 在单节点多核场景中,Query Performance Factor 带来显著性能;
- 对超大规模部署,也可结合 Redis Cluster 做水平切分,将不同数据分片分配到多台机器。
七、总结
通过合理设计索引、精简查询和灵活配置查询线程,您可以在 Redis Software 或 Redis Cloud 环境中,实现接近线性甚至超线性的查询加速。本篇博客提供了从原理到实战的全面指导,助您在多核时代下,充分发挥 Redis Query Engine 的强大性能,为海量数据检索保驾护航。