Redis ZRANGEBYSCORE奇怪的行为

时间:2012-09-21 15:48:20

标签: redis

我正在使用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!! 

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

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

1 个答案:

答案 0 :(得分:4)

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

  

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

     

[...]

     

请记住,如果offset很大,则在到达要返回的元素之前,需要遍历offset个元素的有序集,这可以加起来 O(N) 时间复杂度。

这意味着如果您知道自己只需要一定数量的商品,并指定LIMIT offset count,如果offset是(接近)0,您可以考虑< strong> O(log(N)),但如果返回的项目数很高(或偏移量很高),则可以将其视为 O(N)