我正在尝试对存储为Redis中哈希的用户对象进行排序。
键像users:valid:2
,users:valid:5
,users:valid:10
,users: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
存储为整数一样,以避免按字母顺序排序或我想出的其他任何方式?
答案 0 :(得分:1)
您可以用零填充ID(排序集成员),即'1'变为'000000001',并且字典顺序对您有效。但是,请确保填充ID的长度保持不变(例如9位数字)。