Redis有序集合:如何获取第一个相交元素?

3
我在Redis中有许多大型排序集合(5m-25m),我希望获取这些集合的组合中出现的第一个元素。例如,我有20个集合,想要取集合1、5、7和12,并仅获取这些集合的第一个交集。
使用ZINTERSTORE后跟"ZRANGE foo 0 0"似乎会做比我需要的更多的工作,因为它将计算所有的交集,然后返回第一个交集。是否有一种替代方案,不需要计算所有的交集呢?
1个回答

2

虽然没有直接的本地替代方案,但我建议这样做:

创建一个哈希表,其成员是您的元素。每次向您的排序集合中添加一个元素时,使用HINCRBY增加相关成员。当然,在尝试添加到排序集合之前,您将仅在检查该元素不存在于要添加到的排序集合中后才进行增量。

这样,您就可以快速知道哪些元素出现在4个集合中。

更新:现在我重新考虑了一下,查询哈希表以查找值为4的项可能太昂贵了(O(n))。另一种选择是创建另一个排序集合,其成员是您的元素,它们的分数会增加(如我之前所描述的,但使用ZINCRBY),您可以快速提取所有分数为4的元素(使用ZRANGEBYSCORE)。


谢谢Ofer,我在我的问题中没有表达清楚。这4个集合是来自一组集合的任意四个集合...所以我可能有20个集合,但在给定的查询期间,我想取其中任意2、3或4个,并得到第一个交集。我会修改我的问题。 - jdoig
好的,那么我想不出任何解决Redis集合内置操作的方法...让我们看看是否有其他用户会想到一个主意。我在关注着... - Ofer Zelig
1
最终我有足够的核心将集合分成非常可管理的块(比我最初估计的要多得多),在多个Redis实例上进行分片,然后对所有分片的结果进行缩减。我还发现保留完整的交集集合一段时间可以提高性能,因为这类似于缓存。 - jdoig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接