Redis订购排序集

时间:2019-04-27 11:21:25

标签: sorting redis sortedset

我正在尝试对存储为Redis中哈希的用户对象进行排序。 键像users:valid:2users:valid:5users:valid:10users:invalid:14等。

我的目标是获取按其ID ASC排序的用户,首先是有效用户。

我还将用户ID存储在一个排序集中,其中“得分”是过滤器ID。过滤器映射就像{ valid: 0, invalid: 1 }

$redis.zadd 'sorted-ids', 0, 2
$redis.zadd 'sorted-ids', 0, 5
$redis.zadd 'sorted-ids', 0, 10
$redis.zadd 'sorted-ids', 1, 14

它允许获取已经按ASC排序的用户ID,首先生效。大!但是...

$redis.zrange 'sorted-ids', 0, -1, with_scores: true
=> [["10", 0.0], ["2", 0.0], ["5", 0.0], ["14", 1.0]]

“ 10”位于“ 2”之前。 因此,这些ID实际上不是ASC排序的,因为它们存储为字符串。

https://redis.io/commands/zadd

  

当多个元素具有相同的分数时,它们将被排序   从词法上讲(它们仍然按分数排序作为第一个键,   但是,在本地,所有具有相同分数的元素都相对   按字典顺序排序)。使用的字典顺序是二进制的,   它将字符串作为字节数组进行比较。

在Redis中是否有办法正确实现此排序?像将ids存储为整数一样,以避免按字母顺序排序或我想出的其他任何方式?

1 个答案:

答案 0 :(得分:1)

您可以用零填充ID(排序集成员),即'1'变为'000000001',并且字典顺序对您有效。但是,请确保填充ID的长度保持不变(例如9位数字)。