SORT

对列表、集合或有序集合合中的元素进行排序,并可选择存储结果。

语法

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

引入版本:1.0.0

复杂度摘要:O(N+M*log(M)

返回或存储 清单、设置 或 有序集合 中包含的元素到 key。

该命令还有 SORT_RO 只读变体。

默认情况下,排序是数字排序,元素按解释为双精度浮点数的值进行比较。这是 SORT 最简单的形式:

SORT mylist

假设 mylist 是一个数字列表,该命令将返回相同的列表,其中元素从小到大排序。为了将数字从大到小排序,请使用 DESC 修饰符:

SORT mylist DESC

当 mylist 包含字符串值并且您希望按字典顺序对它们进行排序时,请使用 ALPHA 修饰符:

SORT mylist ALPHA

Redis 支持 UTF-8,假设您正确设置了 LC_COLLATE 环境变量。

可以使用 LIMIT 修饰符限制返回元素的数量。此修饰符采用 offset 参数(指定要跳过的元素数)和 count 参数(指定从 offset 开始返回的元素数)。以下示例将返回 mylist 排序版本的 10 个元素,从元素 0 开始(offset 从零开始):

SORT mylist LIMIT 0 10

几乎所有修饰符都可以一起使用。以下示例将返回前 5 个元素,按字典顺序降序排序:

SORT mylist LIMIT 0 5 ALPHA DESC

必需参数

key

要排序的键的名称。它可以保存列表、集合或有序集合。

可选参数

BY pattern

按 pattern 匹配的外键值(每个 * 被一个元素替换)排序,而不是按元素本身排序。没有 * 的模式或对所有元素解析相同的哈希字段模式会跳过排序。

LIMIT offset count

返回排序结果的切片:跳过 offset 元素并返回到 count。

GET pattern [GET pattern ...]

返回每个排序元素的 pattern 匹配的外键值。使用 GET # 还可以返回元素本身。可以多次给予。

ASC | DESC

按升序(ASC,默认)或降序(DESC)排序。

ALPHA

按字典顺序而不是数字对元素进行排序。

STORE destination

将结果列表存储在 destination 中而不是返回它。

详细说明

按外键排序

有时您希望使用外键作为权重对元素进行排序来进行比较,而不是比较列表、集合或有序集合中的实际元素。假设列表 mylist 包含元素 1、2 和 3,代表存储在 object_1、object_2 和 object_3 中的对象的唯一 ID。当这些对象具有存储在 weight_1、weight_2 和 weight_3 中的关联权重时,可以通过以下语句指示 SORT 使用这些权重对 mylist 进行排序:

SORT mylist BY weight_*

BY 选项采用一个模式(在本例中等于 weight_*),用于生成用于排序的键。这些键名称是通过将第一次出现的 * 替换为列表中元素的实际值(本例中为 1、2 和 3)而获得的。

跳过对元素排序

BY 选项还可以采用不存在的键,这会导致 SORT 跳过排序操作。如果您想检索外部键(请参阅下面的 GET 选项)而不需要排序开销,这非常有用。

SORT mylist BY nosort

检索外部键

我们前面的示例仅返回排序后的 ID。在某些情况下,获取实际对象而不是其 ID(object_1、object_2 和 object_3)更有用。可以使用以下命令根据列表、集合或有序集合中的元素检索外部键:

SORT mylist BY weight_* GET object_*

GET 选项可以多次使用,以便为原始列表、集合或有序集合合的每个元素获取更多键。

还可以使用特殊模式 # 对元素本身进行 GET 标记:

SORT mylist BY weight_* GET object_* GET #

使用外部键的限制

在7.4之前,当启用Redis cluster-mode时,无法保证处理命令的节点上存在外部键。在这种情况下,任何引用外部键模式的 GET 或 BY 的使用都会导致命令失败并出现错误。

从7.4开始,带有哈希标签的模式可以映射到一个槽,因此在Redis cluster-mode中,当模式包含哈希标签并暗示键也在特定槽中时,允许使用BY或GET,这意味着匹配此模式的任何键必须与键位于同一槽中,因此位于同一节点中。例如,在集群模式下,在对 mylist 进行排序时,可以接受 {mylist}weight_* 作为模式,而模式 {abc}weight_* 将被拒绝,从而导致命令失败并出现错误。

要使用带有哈希标签的模式,请参阅 哈希标签 了解更多信息。

从 Redis 7.0 开始,只有在当前用户运行该命令具有完整键读取权限的情况下,才允许使用引用外部键模式的 GET 或 BY。例如,可以通过使用相关命令访问规则指定 '%R~*' 或 '~* 来为用户设置全键读取权限。您可以查看ACL SETUSER命令手册以获取有关设置ACL访问规则的更多信息。如果未设置全键读取权限,该命令将失败并出现错误。

存储排序操作的结果

默认情况下,SORT 将排序后的元素返回给客户端。使用 STORE 选项,结果将存储为指定键处的列表,而不是返回给客户端。

SORT mylist BY weight_* STORE resultkey

使用 SORT ... STORE 的一个有趣模式在于将 EXPIRE 超时与结果键相关联,以便在 SORT 操作的结果可以缓存一段时间的应用程序中。其他客户端将使用缓存列表,而不是为每个请求调用 SORT。当键超时时,可以通过再次调用 SORT ... STORE 创建缓存的更新版本。

请注意,为了正确实现此模式,避免多个客户端同时重建缓存非常重要。这里需要某种类型的锁定(例如使用 SETNX)。

在 BY 和 GET 中使用哈希

可以使用以下语法对哈希字段使用 BY 和 GET 选项:

SORT mylist BY weight_*->fieldname GET object_*->fieldname

字符串->用于将键名与哈希字段名分开。如上所述,键被替换,并且存储在结果键处的哈希被访问以检索指定的哈希字段。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

数组回复:在不传递 STORE 选项的情况下,该命令返回已排序元素的列表。 整数回复:当指定 STORE 选项时,该命令返回目标列表中已排序元素的数量。

RESP3

数组回复:在不传递 STORE 选项的情况下,该命令返回已排序元素的列表。 整数回复:当指定 STORE 选项时,该命令返回目标列表中已排序元素的数量。

资料来源:Redis 官方 SORT 文档;中文内容参考 Redis 文档许可。