【问题标题】:Redis Sorted Sets: How do I get the first intersecting element?Redis Sorted Sets:如何获得第一个相交元素?
【发布时间】:2012-04-21 04:24:36
【问题描述】:

我在 Redis 中有许多大型排序集 (5m-25m),我想获得出现在这些集组合中的第一个元素。 例如,我有 20 套,想拿套 1、5、7 和 12,只得到这些套的第一个交集。

似乎 ZINTERSTORE 后跟“ZRANGE foo 0 0”会做更多我需要的工作,因为它会计算 所有 交叉点然后返回第一个交叉点。是否有不需要计算所有交叉点的替代解决方案?

【问题讨论】:

    标签: redis


    【解决方案1】:

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

    创建一个散列,它的成员就是你的元素。每次添加到您的排序集之一时,增加相关成员(使用HINCRBY)。当然,只有在您检查该元素在您尝试添加的排序集中不存在之后,您才会进行增量。

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

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

    【讨论】:

    • 感谢 Ofer,我的问题并没有真正清楚地表达自己。这 4 个集合是一组集合中的任意四个集合......所以我可能有 20 个集合,但是在给定的查询期间,我不想取其中的任何 2,3 或 4 个并获得第一个交集。我会修改我的问题。
    • 好吧,在这种情况下,我想不出解决 Redis 对集合的内置操作的解决方法……让我们看看其他用户是否会想出一个主意。我正在关注...
    • 我最终拥有了足够的核心来将集合拆分为非常易于管理的块(并且在那里远远超过我最初的假设),覆盖多个 Redis 实例,然后减少所有分片的结果。我还继续发现,将全部交叉点保留一段时间会带来性能优势,因为它类似于缓存。
    猜你喜欢
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多