如何使用排序集中的分数对列表进行排序

时间:2016-06-01 03:15:36

标签: sorting redis

我想在排序集中对分数进行排序。我也想使用limit命令。

我创建了一个列表和一个排序集,如下所示。

zadd weights 10 apple 20 grape 30 banana 40 strawberry 50 melon
lpush list apple melon strawberry banana

我想到了sort命令,并尝试如下。

sort list by weights limit 2 2
sort list by weights->* limit 2 2

我预计这份名单已经分类为" apple banana strawberry melon"只订购"草莓瓜"由limit命令返回。 但是上面的两个命令都不起作用。 (相反,我得到一个按字母顺序排序的)

我如何得到我期望的结果?

感谢。

1 个答案:

答案 0 :(得分:0)

Redis并没有这样做。根据文档排序依据适用于按外部键排序而不是外部键中的值。更确切地说,当Redis执行sort list by weights_*时,它会检查计算此模式的所有键,并将它们与列表中的值进行比较,并返回已排序的结果。

示例:

lpush list apple melon strawberry banana
MSET  weights_apple 10 weights_grape 20 weights_banana 30 weights_strawberry 40 weights_melon 50

现在,如果您尝试排序,结果将是

127.0.0.1:6379> sort list by weight_*
1) "apple"
2) "banana"
3) "strawberry"
4) "melon"

正如您所看到的,排序适用于weight_ * pattern上的外部键。不在单个实体(散列或有序集)中

您可以对hashmap或sorted set执行相同的操作,但是匹配特定模式的键与该键内的值匹配。 例如,要使用hashmap或sorted set实现相同的功能,您必须执行类似的操作。

127.0.0.1:6379> lpush list apple melon strawberry banana
(integer) 4
127.0.0.1:6379> hset weight_apple value 10
(integer) 1
127.0.0.1:6379> hset weight_grape value 20
(integer) 1
127.0.0.1:6379> hset weight_banana value 30
(integer) 1
127.0.0.1:6379> hset weight_strawberry value 40
(integer) 1
127.0.0.1:6379> hset weight_melon value 50
(integer) 1
127.0.0.1:6379> sort list by weights_*->weight
1) "apple"
2) "banana"
3) "melon"
4) "strawberry"

如果您有一个数据结构,例如将游戏玩家的所有信息存储在一个哈希值和一组包含游戏玩家的数据集中,那么这很有效。现在你想按他们的分数对它们进行排序。

您还可以使用get命令获取其他关联值。