【问题标题】:Redis: Sort and get n Neighbour KeysRedis:排序并获得n个邻居键
【发布时间】:2017-12-04 08:56:37
【问题描述】:

假设我在 Redis 中有这些对:

1237.56 "John"
1224.59 "Robert"
1213.34 "Mahmoud"
1242.90 "George"
1020.11 "Mary"
1723.09 "Jay"
1589.77 "Khan"
1106.62 "Albert"

键始终是十进制数。当提供一个数字时,我想在两个方向上获得两个最接近数字的键。

例如,如果我搜索1242 的邻居,结果集应该有:

1224.59 "Robert"
1237.56 "John"
1242.90 "George"
1589.77 "Khan"

这可能吗?我还是 Redis 新手,感谢您的帮助。

【问题讨论】:

    标签: redis


    【解决方案1】:

    是和不是同时。

    为什么是?唯一一种 redis 数据类型 - SORTED SET 允许您获取基于十进制的值范围。因此,使用ZRANGEBYSCORE,您可以按分数范围获取值。

    ZRANGEBYSCORE theKey 1220 1600
    

    为您提供所需的数据集。

    为什么不?在您的问题中,您询问得分的邻居。 ZRANGEBYSCORE 可以获取从最低分数到最高分数的值,但不能获取“获得小于给定的 X 值”或“大于给定的 X 值”。

    【讨论】:

      【解决方案2】:

      这是可能使用带有限制参数的zrangebyscore。您将需要进行两个查询 - 一个来获取每一侧的邻居。

      例如,如果您想获得分数低于score 的n,则查询如下所示:

      zrangebyscore KEY <SCORE> +inf limit 0 <N>
      

      而n 的分数大于这样:

      zrevrangebyscore KEY +inf <SCORE> limit 0 <N>
      

      假设你已经像这样对集合test:key_sort 进行了排序:

      "a": 10
      "b": 20
      "c": 30
      "d": 40
      "e": 50
      

      然后zrevrangebyscore test:key_sort +inf 25 limit 0 2 返回d, c 和zrangebyscore test:key_sort -inf 25 limit 0 2 返回a, b

      【讨论】:

      • 对这种方法的性能有任何想法吗?例如,如果我只想要“最近”的邻居(一个在下面,一个在上面)并且我的数据集很大(数百万)。
      • redis 说性能是 O(logN) redis.io/commands/zrevrangebyscore
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 2014-08-23
      • 2022-12-17
      • 2013-11-11
      相关资源
      最近更新 更多