如上redis结构,如何实现sort的时候根据score倒排序,如果score相等(上面user2和user5的score相等),那么按照age正排序?
期望最后得到的userid排序结果为:
4
1
5
2
3
请问各位:这样的命令该如何写,或者有没有比较好的解决方案
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要实现根据 score
倒序排序,并在 score
相等时按照 age
正序排序的需求,可以借助阿里云 Tair(兼容 Redis®)的 TairZset 数据结构来完成。以下是详细的解决方案和命令示例:
TairZset 支持多维分数排序,可以通过将 score
和 age
组合成一个多维分数(例如 score#age
),并利用其优先级排序机制来满足需求。
排序规则:
score
,按降序排列。age
,按升序排列。在 TairZset 中,分数的比较优先级是从左到右,因此可以将 score
放在第一位,age
放在第二位,格式为 score#age
。
使用 EXZADD
命令将用户数据插入到 TairZset 中,分数格式为 score#age
。例如:
EXZADD myzset NX 90#25 user1 85#30 user2 90#20 user3 85#28 user4 90#25 user5
myzset
是 TairZset 的键名。NX
表示仅在成员不存在时添加。score#age
组成,例如 90#25
表示 score=90
,age=25
。使用 EXZREVRANGE
命令按分数从高到低排序,同时支持多维分数的优先级比较。例如:
EXZREVRANGE myzset 0 -1 WITHSCORES
0 -1
表示返回所有成员。WITHSCORES
返回每个成员的分数。执行上述命令后,TairZset 会按照以下规则排序: 1. 首先按 score
降序排列。 2. 如果 score
相等,则按 age
升序排列。
假设插入以下数据:
用户ID | score | age | 分数格式 |
---|---|---|---|
user1 | 90 | 25 | 90#25 |
user2 | 85 | 30 | 85#30 |
user3 | 90 | 20 | 90#20 |
user4 | 85 | 28 | 85#28 |
user5 | 90 | 25 | 90#25 |
执行 EXZREVRANGE myzset 0 -1 WITHSCORES
后,返回结果如下:
1) "user3"
2) "90#20"
3) "user1"
4) "90#25"
5) "user5"
6) "90#25"
7) "user4"
8) "85#28"
9) "user2"
10) "85#30"
最终排序结果为:user3, user1, user5, user4, user2
,对应的 userid
排序为 3, 1, 5, 4, 2
。
score#age
),否则可能导致排序异常。LIMIT offset count
)进行查询,避免一次性加载过多数据。通过 TairZset 的多维分数排序能力,可以轻松实现复杂的排序需求。对于本问题,只需将 score
和 age
组合成 score#age
格式,并使用 EXZREVRANGE
命令即可完成排序。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。