Redis Query Engine 索引管理最佳实践
Redis Query Engine 索引管理介绍
Redis Query Engine (RQE) 是一个强大的工具,用于对结构化、半结构化和非结构化数据执行复杂的搜索和查询操作。索引是此功能的基础,可实现快速高效的数据检索。正确管理这些索引对于实现最佳性能、可扩展性和资源利用至关重要。
本指南概述了 RQE 索引在其整个生命周期中的管理最佳实践。它提供了以下建议:
- 规划和创建索引以适应您的查询模式。
- 使用索引别名管理模式更新并最大程度地减少停机时间。
- 监控和验证索引填充情况,以确保查询就绪。
- 通过查询分析和内存管理优化性能。
- 在独立和集群 Redis 环境中维护和扩展索引。
- 索引管理的版本控制、测试和自动化。
为什么索引管理很重要
索引直接影响查询速度和资源消耗。管理不当的索引可能导致内存使用量增加、查询时间变慢以及维护数据一致性的挑战。通过遵循本指南中概述的策略,您可以:
- 降低运维开销。
- 提高应用性能。
- 确保模式更改期间的平稳过渡。
- 随着数据集的增长高效扩展。
战略性地规划您的索引
战略性地规划您的索引需要理解应用程序的查询模式并量身定制索引以匹配。首先确定您的应用程序执行的搜索类型——例如全文搜索、范围查询或地理空间查找——以及涉及的字段。根据其用途对字段进行分类:可搜索字段(例如,用于全文搜索的 TEXT
)、可过滤字段(例如,用于精确匹配搜索的 TAG
)和可排序字段(例如,用于范围查询或排序的 NUMERIC
)。将字段类型与其预期用途匹配,并避免索引很少查询的字段以节省资源。以下是索引类型的列表:
TEXT
:用于自由文本搜索,如果某些字段更重要,则设置权重。TAG
:用于分类数据(例如,产品类别),有利于精确匹配和过滤。NUMERIC
:用于数值范围(例如,价格、时间戳)。GEO
:用于地理空间坐标(例如,纬度/经度)。GEOSHAPE
:用于将位置表示为点,也可用于定义形状并查询点与形状之间的交互(例如,查找包含在封闭形状内的所有点)。VECTOR
:用于高维相似性搜索。
有关如何最佳使用这些索引类型的讨论和示例,请参阅这些页面。
接下来,在样本数据集上模拟查询以识别潜在的瓶颈。使用 FT.PROFILE
等工具分析查询执行并根据需要优化模式。例如,为 TEXT
字段分配权重以优先显示结果,或使用 FT.CREATE
命令的 PREFIX
选项将索引限制在特定的键模式。请注意,创建索引时可以使用多个 PREFIX
子句(参见下方)。创建索引后,使用实际查询验证其性能,并使用可用工具监控使用情况:
FT.EXPLAIN
和FT.EXPLAINCLI
允许您查看 Redis Query Engine 如何解析给定的搜索查询。FT.EXPLAIN
返回查询执行计划的结构化细分,而FT.EXPLAINCLI
则以更易于理解的树状格式呈现。这些命令对于诊断查询结构并确保其与预期逻辑一致非常有用。FT.INFO
提供有关索引的详细统计信息,包括索引文档数量、内存使用情况和配置设置。它有助于监控索引增长、评估内存消耗以及验证索引结构以检测潜在的低效。FT.PROFILE
在捕获执行详细信息的同时运行查询,这有助于揭示查询性能瓶颈。它提供了有关处理时间、键访问和过滤器应用的深入信息,使其成为微调复杂查询和优化搜索效率的关键工具。
避免过度索引。索引所有字段会增加内存使用量并可能减慢更新速度。仅索引对于您计划的查询至关重要的字段。
索引创建
- 使用
FT.CREATE
命令定义索引模式。 - 为
TEXT
字段分配权重,以便在全文搜索结果中优先显示某些字段。 - 使用
PREFIX
选项将索引限制为具有特定模式的键。创建索引时使用多个 PREFIX 子句允许您在单个索引下索引多个键模式。这在以下几种场景中非常有用:-
如果您的 Redis 数据库将不同类型的实体存储在不同的键前缀下(例如,
user:123
、order:456
),则通过指定多个前缀,单个索引可以同时覆盖两者。例如:FT.CREATE my_index ON HASH PREFIX 2 "user:" "order:" SCHEMA name TEXT age NUMERIC status TAG
这种方法允许跨多种实体类型进行搜索,而无需单独的索引。
-
您可以使用单个查询在相关数据结构之间进行搜索,而不是分别查询多个索引。当数据结构共享通用字段时,例如在统一联系人索引下搜索客户和供应商记录时,这尤其有用。
-
为类似数据类型维护多个索引可能会导致内存和查询性能低下。通过将数据整合到具有多个前缀的一个索引下,您可以减少开销,同时仍然允许清晰的键组织。
-
如果您的数据模型发生变化并引入了新的键模式,从一开始就使用多个
PREFIX
子句可确保未来的兼容性,而无需进行完整的重新索引。
-
- 数据加载策略:处理大型数据集时,在创建索引之前将数据加载到 Redis 中。使用
ON HASH
或ON JSON
选项以匹配数据结构。
索引别名
索引别名充当基础索引的抽象名称,使应用程序能够引用别名而不是实际索引名称。这种方法简化了模式更新和索引管理。
索引别名有多种用例,包括:
- 模式更新:更新索引模式时,创建一个新索引并将其与相同的别名关联。这允许无缝过渡,而无需进行应用层面的更改。
- 版本控制:使用别名管理索引的不同版本。例如,最初将别名 `products` 分配给
products_v1
,然后在模式演变时分配给products_v2
。 - 测试和回滚:在分阶段部署期间将别名分配给测试索引。如果出现问题,快速将别名切换回稳定的索引。
别名最佳实践
- 在初始设置期间始终为索引创建别名,即使您不期望立即进行模式更改。
- 使用清晰且描述性的别名名称,以避免混淆(例如,
users_current
或orders_live
)。 - 确保一个别名一次只指向一个索引,以维持可预测的查询结果。
- 使用别名提供特定于租户的访问。例如,将特定于租户的别名(如
tenant1_products
和tenant2_products
)分配给不同的索引,以实现隔离的查询性能。
管理别名的工具
- 分配别名:
FT.ALIASADD
my_alias my_index
- 更新别名:
FT.ALIASUPDATE
my_alias new_index
- 移除别名:
FT.ALIASDEL
my_alias
监控和故障排除别名
- 使用
FT.INFO
命令检查哪些别名与索引关联。 - 确保您的别名始终指向有效索引并在模式更改期间正确更新。
监控索引填充情况
-
使用
FT.INFO
命令监控num_docs
和indexing
字段,以检查所有预期文档是否已索引。FT.INFO my_new_index
-
使用示例查询验证数据,确保正确索引
FT.SEARCH my_new_index "*"
-
使用
FT.PROFILE
分析查询计划并验证性能FT.PROFILE my_new_index SEARCH QUERY "your_query"
-
实施脚本定期验证文档计数和查询结果。例如,在 Python 中:
import re def check_index_readiness(index_name, expected_docs): r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True) info = r.execute_command('FT.INFO', index_name) num_docs = int(info[info.index('num_docs') + 1]) return num_docs >= expected_d if check_index_readiness('my_new_index', 100000): print("Index is fully populated!") else: print("Index is still populating...")
监控索引性能
- 使用
FT.PROFILE
命令分析查询性能并识别瓶颈。 - 定期使用
INFO
memory
和FT.INFO
命令监控内存使用情况,以检测增长模式并优化资源分配。
索引维护
- 如果需要更改模式,则使用更新的模式创建一个新索引,并在索引准备就绪后重新分配别名。
- 使用Redis 键过期自动移除过期记录并保持索引精简。
FT.ALTER 与别名
当您需要在不重建现有索引的情况下添加新字段时,请使用 FT.ALTER
,这可以最大程度地减少停机时间和资源使用。但是,FT.ALTER
无法移除或修改现有字段,限制了其灵活性。
当进行需要重新索引的模式更改时,例如修改字段类型或移除字段,请使用索引别名。在这种情况下,创建一个包含更新模式的新索引,填充数据,然后使用 FT.ALIASUPDATE
将查询无缝切换到新索引,而不会中断应用程序功能。
扩展和高可用性
- 在 Redis 集群设置中,请确保设计索引时考虑键分布,以防止查询效率低下。
- 测试副本升级时索引的行为,以确保节点之间查询行为一致。
版本控制和测试
- 更改模式时,与旧索引并行创建一个新版本的索引,并逐步迁移数据。
- 在将索引更改部署到生产环境之前,先在预生产环境进行测试。
清理
- 使用
FT.DROPINDEX
命令移除未使用的索引并释放内存。谨慎使用DD
(删除文档)标志,以避免意外的数据删除。 - 如果数据不再相关,请确保没有与已删除索引关联过的键保留下来。
文档和自动化
- 记录您的索引配置,以便将来维护。
- 使用脚本或编排工具自动化索引创建、监控和清理。