我正在尝试对Redis中存储为散列的用户对象进行排序。关键字有users:valid:2
、users:valid:5
、users:valid:10
、users:invalid:14
等。
我的目标是获取用户按他们的is排序,有效用户优先。
我还将用户id存储在一个有序的集合中,其中"score“是一个过滤器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
它允许获取已按顺序排序的用户ids,首先有效。太棒了!然而..。
$redis.zrange 'sorted-ids', 0, -1, with_scores: true
=> [["10", 0.0], ["2", 0.0], ["5", 0.0], ["14", 1.0]]
"10“在"2”之前。所以ids实际上不是按ASC排序的,因为它们是以字符串的形式存储的。
https://redis.io/commands/zadd
当多个元素具有相同的分数时,它们按字典顺序排序(它们仍然作为第一个键按分数排序,但是在本地,具有相同分数的所有元素都是按字典顺序相对排序的)。使用的字典顺序是二进制的,它将字符串作为字节数组进行比较。
在Redis中有没有一种方法可以正确地实现这种排序?比如将ids
存储为整数以避免词法排序,或者其他我能想到的方法?
发布于 2019-04-28 04:39:12
你可以用0填充你的ID(已排序的集合成员),例如,'1‘变成'000000001',字典序排序将为你工作。但是,请确保填充ID的长度保持不变(例如9位数字)。
https://stackoverflow.com/questions/55880040
复制相似问题