Redis排序给出了奇怪的结果

Redis排序给出了奇怪的结果,redis,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> 我知道数据的用途,而不是。它将被修复。

我试图找出为什么我会从这个排序查询中得到这些奇怪的结果:

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的顺序)


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

在末尾添加ALPHA

sort set:package:1:all_games by hash:game:*->rating DESC LIMIT 0 10 GET hash:game:*->rating ALPHA
默认情况下,排序是数字的,元素通过其解释为双精度浮点数的值进行比较

如果列表(或集合)包含字符串值,并且希望按字典顺序对其排序,请使用ALPHA修饰符


请参见:

在末尾添加ALPHA

sort set:package:1:all_games by hash:game:*->rating DESC LIMIT 0 10 GET hash:game:*->rating ALPHA
默认情况下,排序是数字的,元素通过其解释为双精度浮点数的值进行比较

如果列表(或集合)包含字符串值,并且希望按字典顺序对其排序,请使用ALPHA修饰符


请参阅:

正如Ofer所提到的,默认情况下,排序是数字的,元素作为双精度浮点数进行比较

Redis排序函数通过从原始容器填充C数组来工作。此数组中项目的初始顺序是初始容器中项目的顺序(例如set未定义)

然后用分数值标记每个项目。Redis使用标准strtod函数将字符串值转换为double。此函数采用尽最大努力的方式工作:它尝试转换尽可能多的字符。因此,“9”、“9,1”、“9,2”和“9,4”字符串都将转换为9.0

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


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

正如Ofer所提到的,默认情况下,排序是数字的,元素作为双精度浮点数进行比较

Redis排序函数通过从原始容器填充C数组来工作。此数组中项目的初始顺序是初始容器中项目的顺序(例如set未定义)

然后用分数值标记每个项目。Redis使用标准strtod函数将字符串值转换为double。此函数采用尽最大努力的方式工作:它尝试转换尽可能多的字符。因此,“9”、“9,1”、“9,2”和“9,4”字符串都将转换为9.0

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


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

我试过ALPHA,但它也不是我需要的。我知道默认情况下,
sort
使用数字排序。但这只是一个关于为什么它会给出这样的结果的问题。没有ALPHA的排序使用浮点版本的值。请看@Didier对为什么“9”、“9,1”、“9,2”、“9,4”被视为相同的解释。我尝试了ALPHA,但它也不是我所需要的。我知道默认情况下,
sort
使用数字排序。但这只是一个关于为什么它会给出这样的结果的问题。没有ALPHA的排序使用浮点版本的值。参见@Didier对为什么“9”、“9,1”、“9,2”、“9,4”被同等对待的伟大解释。