gpt4 book ai didi

Redis:是否可以按其他键值对具有相同分数的有序集合结果进行排序

转载 作者:IT王子 更新时间:2023-10-29 06:00:27 25 4
gpt4 key购买 nike

ZADD myset 1 ad1
ZADD myset 1 ad2

SET order:ad1 1
SET order:ad2 2

如何先按有序集分数排序,再按订单值排序?

最佳答案

如果你想存储一个结果(不改变数据存储的方式),那么你可以使用 SORT命令。可以应用于zset。

例如:

> zadd myset 1 albert
> zadd myset 1 joseph
> zadd myset 4 bertrand
> zadd myset 2 casimir
> zadd myset 3 alfred

您可以按值排序:

> sort myset alpha
1) "albert"
2) "alfred"
3) "bertrand"
4) "casimir"
5) "joseph"

您可以按分数和值(value)排序:

> zrange myset 0 -1
1) "albert"
2) "joseph"
3) "casimir"
4) "alfred"
5) "bertrand"

现在让我们为这些对象添加一个新属性:

> set order:albert 5
> set order:alfred 3
> set order:casimir 1
> set order:joseph 4
> set order:bertrand 2

您可以按新的订单属性排序:

> sort myset by order:*
1) "casimir"
2) "bertrand"
3) "alfred"
4) "joseph"
5) "albert"

现在,如果您需要按分数和此顺序属性排序,那么您别无选择,只能在 zset 中实现顺序属性或在顺序属性中实现分数。

例如,在zset中添加order属性,我们得到:

> del myset
> zadd myset 1 5:albert
> zadd myset 1 4:joseph
> zadd myset 4 2:bertrand
> zadd myset 2 1:casimir
> zadd myset 3 3:alfred
> zrange myset 0 -1
1) "4:joseph"
2) "5:albert"
3) "1:casimir"
4) "3:alfred"
5) "2:bertrand"

注意:在这种情况下,属性字段是根据字典顺序排序的,因此如果您需要数字顺序和多位数字,则可能必须对值进行规范化。有多种技巧可以做到这一点。例如,您可以存储“11”、“212”或“3123”,而不是存储“1”、“12”或“123”,第一个数字代表号码的位数。

如果score和order属性都可以改变,这样就不太方便了,在客户端排序会更好。这可以在两次往返中实现,方法是在一侧检索带有分数的 zset,在另一侧检索相应的顺序值。

> zrange myset 0 -1 withscores
> sort myset by order:* get order:* get #

由客户端连接两个结果(使用某种字典或关联数组),并排序以获得最终结果。

关于Redis:是否可以按其他键值对具有相同分数的有序集合结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com