1

我正在使用redis 2.6。我遇到了奇怪的ZRANGEBYSCORE函数行为。我有一个长度约为几百万个元素的排序集。像这样的东西:

10 marry 
15 john 
25 bob 
...

所以比较查询:

ZRANGEBYSCORE longset 25 50 LIMIT 0 20  works like a charm, it takes milliseconds
ZRANGEBYSCORE longset 25 50             this one hangs up for a minutes!! 

我感兴趣的所有元素都在集合的前一百个中。我认为没有必要扫描重量大于“50”的元素,因为它是 SORTED 集。

请解释一下 redis 是如何扫描排序集的,以及为什么这两个查询之间存在如此大的差异。

4

1 回答 1

5

IMO 的 Redis 最好的事情之一是您可以检查文档中每个命令的时间复杂度。zrangebyscore的文档指定:

时间复杂度:O(log(N)+M),其中 N 是排序集中的元素数,M 是返回的元素数。如果 M 是常数(例如,总是用 LIMIT 要求前 10 个元素),你可以认为它是 O(log(N))。

[...]

请记住,如果offset很大,则需要遍历排序集以offset获取元素,然后才能返回元素,这可能会增加O(N)时间复杂度。

这意味着如果您知道您只需要一定数量的项目,并指定 a LIMIT offset count,如果offset是 (close to) 0,您可以认为它O(log(N)),但如果返回的项目数量很高(或偏移量很高),可以认为是O(N)

于 2012-09-21T16:03:28.137 回答