我在 Redis 中有许多大型排序集(5m-25m),我想获得出现在这些集合组合中的第一个元素。例如,我有 20 套,想拿套 1、5、7 和 12,只得到这些套的第一个交集。
似乎 ZINTERSTORE 后跟“ZRANGE foo 0 0”会做更多我需要的工作,因为它会计算所有交叉点然后返回第一个交叉点。是否有不需要计算所有交叉点的替代解决方案?
我在 Redis 中有许多大型排序集(5m-25m),我想获得出现在这些集合组合中的第一个元素。例如,我有 20 套,想拿套 1、5、7 和 12,只得到这些套的第一个交集。
似乎 ZINTERSTORE 后跟“ZRANGE foo 0 0”会做更多我需要的工作,因为它会计算所有交叉点然后返回第一个交叉点。是否有不需要计算所有交叉点的替代解决方案?
尽管我建议这样做,但没有直接的本地替代方案:
创建一个哈希,其成员是您的元素。每次添加到您的排序集之一时,增加相关成员(使用HINCRBY
)。当然,只有在您检查该元素在您尝试添加的排序集中不存在之后,您才会进行增量。
这样,您可以快速知道哪些元素出现在 4 个集合中。
更新:现在我重新考虑它,查询您的哈希以查找值为 4 ( O(n) )的项目可能太昂贵了。另一种选择是创建另一个排序集,它的成员是你的元素,它们的分数会增加(正如我之前描述的,但是使用ZINCRBY
),你可以快速拉出分数为 4 的所有元素(使用ZRANGEBYSCORE
)。