迭代redis数据的有效方法是什么



你好,我有一个redis数据库,其中包含10万多人的面部嵌入。所有这些都作为键值对存储在redis中。例如:

{
"embedding:angelina" : [128-D vector of angelina],
"embedding:emma" : [128-D vector of emma],
"embedding:dicaprio" : [128-D vector of dicaprio]
}

现在,我试图将目标嵌入与数据集中的所有嵌入进行比较,以找到最佳匹配。我尝试的一种方法是首先从嵌入*表达式开始检索所有密钥。然后,对这些嵌入进行迭代,并找到与目标嵌入的距离。如果距离小于阈值,那么我们将把它附加到一个列表中,然后从该列表中选择最短的距离。我不知道,但我觉得这不是最好的做法。如果有人能帮我找到更好的方法,我会很高兴吗?

注意:我知道ElasticSearch是这类任务的一个很好的候选者,但我现在需要坚持使用redis。

这听起来是Redis VSS 的一个不错的候选者

按模式对Redis键进行迭代是可能的,但这不是最佳实践。Redis文档警告如下:

警告:将KEYS视为一个只能在生产环境中极其小心地使用的命令。当对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS。如果您正在寻找在密钥空间的子集中查找密钥的方法,请考虑使用SCAN或集合。

使用SCAN将保护Redis实例的资源,但使用SCAN获取大型数据集中的所有密钥仍然需要很长时间和很多请求。

根据您的情况,会想到一些变通方法:

  1. 知道你要进入哪些钥匙。您可以通过以下方式做到这一点:
  • 在其他地方维护一个键列表,这样您就可以逐个键进行查找,如果您无论如何都要检查高百分比的键,这可能不值得麻烦
  • 按顺序对密钥进行编号:如果你知道你将有100k-200k个密钥,并且你不希望删除很多,你可以只制作密钥";嵌入:{1-100k}";并在值中存储任何其他元数据,如CCD_
  • 维护Redis集中的密钥列表:这似乎是上面引用的警告中的建议。在数据集中添加或删除embedding:.*密钥时,也可以使用SADDSREM在集合中添加或删除密钥名称(可以命名为例如embedding_sample_keys(。我没有尝试过,但听起来很可行
  1. 使用哈希:这将把所有数据存储在一个Redishash结构下。(密钥可能是embedding_data(。这有一些缺点,比如不能为每个缓存密钥设置不同的TTL。您可以使用HKEYS和HSCAN访问哈希中的所有密钥,这可能是对扫描整个数据集的改进

相关内容

最新更新