Redis ZRANGEBYSCORE奇怪的行为
我正在使用Redis2.6。我遇到了Redis ZRANGEBYSCORE奇怪的行为,redis,Redis,我正在使用Redis2.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
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”的元素
因为它是排序集
请解释redis是如何扫描排序集的,以及为什么这两个查询之间存在如此大的差异。关于redis,IMO,最好的一点是,您可以检查文档中每个命令的时间复杂度。用于的文档指定: 时间复杂度:O(log(N)+M),其中N是排序集中的元素数,M是返回的元素数。如果M是常数(例如总是要求前10个元素具有限制),则可以考虑O(log(n))。 [……] 请记住,如果
offset
很大,则在到达要返回的元素之前,需要遍历offset
元素的排序集,这可能会增加时间复杂度O(N)
这意味着,如果你知道你只需要一定数量的项目,并指定一个<代码>限制偏移计数<代码>,如果<代码>偏移是(接近)<代码> 0代码>代码,你可以认为它是强> O(log(n))< /强>,但是如果返回的项目数高(或者偏移量高),它可以被认为是<强> O(n)。
关于Redis,IMO,最好的一点是,您可以检查文档中每个命令的时间复杂度。用于的文档指定: 时间复杂度:O(log(N)+M),其中N是排序集中的元素数,M是返回的元素数。如果M是常数(例如总是要求前10个元素具有限制),则可以考虑O(log(n))。 [……] 请记住,如果offset
很大,则在到达要返回的元素之前,需要遍历offset
元素的排序集,这可能会增加时间复杂度O(N)
这意味着,如果你知道你只需要一定数量的项目,并指定一个<代码>限制偏移计数<代码>,如果<代码>偏移是(接近)<代码> 0代码>代码,你可以认为它是强> O(log(n))< /强>,但是如果返回的项目数高(或者偏移量高),则可以被认为是“强> O(n)< /强>