2012-09-21 32 views
1

我使用的是redis 2.6。我遇到了ZRANGEBYSCORE函數的奇怪行爲。 我有一個有約數百萬元素長度的排序集。 事情是這樣的:Redis 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!! 

這我intrested在一套中的百強之首的所有元素。 我認爲沒有必要掃描重量大於「50」 的元素,因爲它是SORTED集合。

請解釋redis如何掃描排序集以及爲什麼這兩個查詢之間存在如此大的差異。

回答

4

關於Redis,IMO的最好的事情之一是您可以檢查文檔中每個命令的時間複雜性。爲zrangebyscore指定文檔:

時間複雜度:O(日誌(N)+ M),N是在所述有序集合和M被返回的元素數元素的數目。如果M是常量(例如,總是要求使用LIMIT的前10個元素),則可以將其視爲O(log(N))。

[...]

請記住,如果offset大,有序集合,需要得到的元素返回,這最多可以添加Ø之前走過的offset元素(N)時間複雜度。

這意味着,如果你知道你只需要一定數量的項目,並指定LIMIT offset count,如果offset是(接近)0,你可以認爲它O(日誌(N)),但是如果返回的項目數量很多(或偏移很高),則可以認爲是O(N)