Redis排序给出了奇怪的结果

时间:2012-01-25 13:29:09

标签: 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' s)。

有人能解释一下这里发生了什么吗?

2 个答案:

答案 0 :(得分:2)

正如Ofer所提到的,默认情况下,sort是数字,元素被比较为双精度浮点数。

Redis排序功能通过从原始容器填充C数组来工作。此数组中项目的初始顺序是初始容器中项目的顺序(例如,未设置为set)。

然后用分数值标记每个项目。 Redis使用标准的strtod函数将字符串值转换为double。此函数使用尽力而为方法:它尝试转换尽可能多的字符。所以“9”,“9,1”“9,2”和“9,4”字符串都将被转换为9.0

最后,使用标准qsort算法对数组进行排序,the BENTLEY/McILROY algorithm(取决于是否设置了限制参数)。 AFAIK,这些排序算法都不是stable。这意味着具有相同分数的项目的顺序在结果中将是随机的。

这正是您在示例中得到的结果:首先是“10”项,然后是“9”项。 “9”项的顺序是随机的。

答案 1 :(得分: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