复述,最佳实践

分区索引

Redis的单个实例(或shard)是非常强大的,但在某些情况下,你可能想要一个索引跨多个实例。例如,通过并行化或索引超过实例的大小来增加吞吐量。假设您想对多个键执行操作。对键进行分区的一种有效方法是为每个分区提供一个均匀分布的键片,并行地对每个分区执行所需的任何操作,然后在最后合并结果。

为了以理想的方式实现密钥的均匀分布,我们将使用非加密散列算法。任何快速哈希函数都可以,尽管我们只使用熟悉的函数CRC-32对于这个示例。大多数时候,人类会遇到以十六进制形式输出的哈希算法(例如,“my-cool-document”将产生F9FDB2C9的CRC-32输出)。十六进制表示对人类来说更容易,但它仅仅是十进制整数值的一种替代表示,这意味着我们可以对这个值进行计算。

接下来,我们需要确定分区的数量——这应该至少是实例数量的两倍。这有利于成长;如果需要添加实例,那么可以将一个分区移动到另一个实例。假设我们有3个实例和6个分区。

为了计算特定文档所在的分区,我们将执行以下操作:

HashFunction (document_id)国防部number_of_partitions

如果我们是带有6个分区的“my-cool-document”,那么它将像这样工作:

CRC32(" my-cool-document ") = F9FDB2C9(十六进制)或4194153161(十进制)
4194153161 mod 6 = 5

在Re万博体育彩dis Enterprise中,你可以通过使用预定义的正则表达式或用花括号包围键的一部分来控制键进入哪个分片。所以,在我们的例子中,我们可以为这个文档设置一个像这样的键:

idx: my-cool-document {5}

然后我们有另一个文档“my-other-document”,它产生的分区号是3,所以键看起来像这样:


idx: my-other-document {3}

如果您需要对附加的辅助键进行操作,并将其绑定到此文档,那么您将希望它们位于同一分片上,以便您可以同时对两个键进行操作,而不会遇到交叉批错误。为此,您需要向键中添加与实际文档相同的分区号。

缩小并检查您的数据,您将看到您的索引现在相当均匀地分布在您的分区中。您可以将需要跨每个分区完成的工作并行化。当您需要在整个索引中完成工作时,您的客户端将需要在每个分区上执行相同的逻辑,获取结果,并在客户端中执行所需的任何合并。

Baidu