2012-01-25 79 views
0

我試圖找出爲什麼我得到從這種查詢這些奇怪的結果:Redis的排序給出了奇怪的結果

redis> sort set:package:1:all_games by hash:game:*->rating DESC LIMIT 0 10 GET hash:game:*->rating 
1. "10" 
2. "10" 
3. "10" 
4. "9,1" 
5. "9" 
6. "9,2" 
7. "9" 
8. "9,1" 
9. "9" 
10. "9,4" 
redis> 

我知道數據使用,以代替。它會被修復。但爲什麼排序如此不一致呢?我至少希望它能給出一致的結果(順序爲9,1)。

任何人都可以解釋這裏發生了什麼?

回答

2

正如奧弗所提到的,默認情況下,排序是數字和元件被作爲雙精度浮點數進行比較。

Redis排序函數通過從原始容器中填充C數組來工作。此數組中項目的初始順序是初始容器中項目的順序(例如,未定義該項目)。

然後用分數值標記每個項目。 Redis使用標準strtod函數將字符串值轉換爲double。此功能以盡力而爲的方式工作:儘可能多地轉換字符。因此,「9」,「9,1」,「9,2」和「9,4」字符串將全部轉換爲9.0

最後,使用標準qsort算法或the BENTLEY/McILROY algorithm(取決於if限制參數是否設置)。 AFAIK,這些算法都不是stable。這意味着結果中具有相同分數的項目的順序將是隨機的。

這正是你在這個例子中得到的結果:首先有「10」項,然後是「9」項。 「9」項目的順序是隨機的。

+0

感謝您的滿足。現在很清楚。 – Ikke

1

在末端添加ALPHA

sort set:package:1:all_games by hash:game:*->rating DESC LIMIT 0 10 GET hash:game:*->rating ALPHA 

默認情況下,排序是數字和元素相比可以通過值解釋爲雙精度浮點數。

當列表(或集合)包含字符串值並且您想按字典順序對它們進行排序時,請使用ALPHA修飾符。

參見:http://redis.io/commands/sort

+0

我試過ALPHA,但它不是我所需要的。我知道'sort'默認使用數字排序。但這只是一個問題,它爲什麼會給出結果。 – Ikke

+0

不使用ALPHA排序使用值的浮點版本。請參閱@迪迪埃對「9」,「9,1」,「9,2」,「9,4」的處理方式相同的理由。 –