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