Redis按分数和日期排序

ippsafx7  于 2022-10-31  发布在  Redis
关注(0)|答案(1)|浏览(200)

我正在尝试如何根据分数和日期计算职位/排名的策略
我有一个两个数据与相同的分数显示在下面的图像。
如果我运行命令
$ZADD usersScores 11 userId6
它会将其添加到userId 5上方,这不是我想要的内容
是否可以根据日期将其添加到userId 1下面?

这是我的基本目标,我希望根据金额显示头寸,最早的头寸将通过日期显示在最上面

谢谢你!

c9qzyr3d

c9qzyr3d1#

已排序的集合排序

排序后的集合首先按得分排序,如果得分相等,则按成员的词法排序。因此,在你的例子中,如果你添加了以下键:

127.0.0.1:6379> ZADD myset 11 user1
(integer) 1
127.0.0.1:6379> ZADD myset 11 user5
(integer) 1
127.0.0.1:6379> ZADD myset 24 user3
(integer) 1
127.0.0.1:6379> zadd myset 54 user2
(integer) 1
127.0.0.1:6379> zadd myset 11 user6
(integer) 1

然后执行ZRANGE,您将得到按字母顺序排列的升序成员:

127.0.0.1:6379> zrange myset 0 -1 WITHSCORES
 1) "user1"
 2) "11"
 3) "user5"
 4) "11"
 5) "user6"
 6) "11"
 7) "user3"
 8) "24"
 9) "user2"
10) "54"

它看起来像什么,是你的GUI正在使用,或者只是在引擎盖下传递rev参数给ZRANGE,它以相反的顺序排列所有内容(分数降序,字母顺序相反)

127.0.0.1:6379> ZRANGE myset 0 -1 WITHSCORES REV
 1) "user2"
 2) "54"
 3) "user3"
 4) "24"
 5) "user6"
 6) "11"
 7) "user5"
 8) "11"
 9) "user1"
10) "11"

第二个排序依据

有几种方法可以处理第二次排序,方法是使用已排序的集合,让我们假设您希望使用32位unix时间戳来完成此操作
1.您可以将第二个sortby字段添加到成员名称前面,这样,如果user 6的得分为1659579650,您只需将成员名称设置为1659579650:user1,然后在排序时,它将按照词法进行排序
1.你可以把分数和第二个结合起来,因为11是分数,我们可以把11向左移32位,然后加上/或时间戳,结果是48,904,219,906,它们就会正确排序,然后当你想找到分数时,你所需要做的就是把分数右移32位。

相关问题