对于 RediSearch,创建单个索引还是多个索引更好?

luk*_*kik 3 performance search redis redisearch

我在多租户应用程序中使用RediSearch构建索引,该应用程序具有:

  • 150,000 名租户
  • 每个租户平均拥有 3,500 个客户
  • 每个客户有 10 个字段将被添加到索引中
  • 所有字段都是TextFields.

问题是,在这种情况下最佳实践(性能、内存/存储、灵活性)是什么?

我应该创建一个customer_index带有tenant_code字段的字段来帮助识别哪些数据属于哪个租户,还是应该创建一个租户特定的索引?

根据我目前的经验和理解,租户特定的索引意味着许多索引但其中的数据较少,它还可以让我灵活地为特定租户删除和重新创建索引?

在 Python 中,代码如下:

单一客户索引

client = Client(`customer_index`)
client.create_index(
            [
                TextField('tenant_code'), TextField('last_name'), TextField('first_name'),
                TextField('other_name'), 
            ]
        )   
Run Code Online (Sandbox Code Playgroud)

租户特定客户索引

client = Client(`tenant_code_customer_index`)
client.create_index(
            [
                TextField('last_name'), TextField('first_name'), TextField('other_name'), 
            ]
        )
Run Code Online (Sandbox Code Playgroud)

Mar*_*erg 6

因为每个租户只有 3500 个客户(相对较少),所以最好使用更大的索引来明智地使用内存。由于记录很少,每个索引的资源开销可能会超过索引本身的大小。这也将增加 redis 本身的键数,因为为每个索引的每个索引词创建了一个新的 Redis 键。因此,如果您在每个数据库中有大约 2000 个唯一项,您最终将拥有 300M Redis 键 (2k * 150k)。相比之下,使用单个索引将只剩下 2k 个键。

在性能方面,也不应该有任何区别,因为租户代码本身就是一个倒排索引,因此搜索不太可能需要在更大的索引中筛选更多记录。

对于删除,您可以简单地收集符合条件的 ID 列表,例如“ FT.SEARCH idx @tenant:yourcode”,然后分别调用FT.DEL这些记录中的每一个。我假设这不是每五秒执行一次的操作,所以你应该在那里完成。

请注意,现在甚至可能无法使用 150k 索引,因为为每个索引创建了一个专用的索引线程(尽管在未来版本中将提供在单个线程上执行索引的选项)。