我正在使用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如何扫描排序集以及为什么这两个查询之间存在如此大的差异。
答案 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)。