2012-01-25 42 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”的处理方式相同的理由。 –