- 用法
-
SORT key [ BY by-pattern ] [ LIMIT offset count ] [ GET get-pattern ] [ [ GET get-pattern ] ... ] [ ASC | DESC ] [ ALPHA ] [ STORE destination ]
- 复杂度
- O(N+M*log(M)),其中 N 是要排序的列表或集合中的元素数量,M 是返回的元素数量。当元素未排序时,复杂度为 O(N)。
- 起始版本
- 1.0.0
- ACL 类别
- @set, @sortedset, @list, @dangerous, @write, @slow
此命令还有一个只读变体 SORT_RO
。
默认情况下,排序是数值型的,元素按其解释为双精度浮点数的值进行比较。这是 SORT
最简单的形式。
SORT mylist
假设 mylist
是一个数字列表,此命令将返回一个元素从小到大排序的相同列表。要将数字从大到小排序,请使用 !DESC
修饰符。
SORT mylist DESC
当 mylist
包含字符串值并希望按字典顺序排序时,请使用 !ALPHA
修饰符。
SORT mylist ALPHA
Valkey 支持 UTF-8,前提是您正确设置了 !LC_COLLATE
环境变量或 locale-collate
配置。
可以使用 !LIMIT
修饰符限制返回元素的数量。此修饰符接受 offset
参数,用于指定要跳过的元素数量,以及 count
参数,用于指定从 offset
开始返回的元素数量。以下示例将返回 mylist
排序后的 10 个元素,从元素 0 开始(offset
从零开始计数)。
SORT mylist LIMIT 0 10
几乎所有修饰符都可以一起使用。以下示例将返回前 5 个元素,按字典序降序排序。
SORT mylist LIMIT 0 5 ALPHA DESC
按外部键排序
有时您希望使用外部键作为权重进行元素排序,而不是比较列表、集合或有序集合中的实际元素。假设列表 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 #
使用外部键的限制
在 8.0 之前,当启用 Valkey cluster-mode
时,无法保证外部键在命令处理的节点上存在。在这种情况下,任何引用外部键模式的 GET
或 BY
用法都将导致命令失败并报错。
从 8.0 开始,带有哈希标签的模式可以映射到一个槽,因此在 Valkey cluster-mode
中,当模式包含哈希标签并且暗示键所在的特定槽时,允许使用 BY
或 GET
,这意味着任何匹配此模式的键必须与键在同一个槽中,因此也在同一个节点上。例如,在集群模式下,当排序 mylist
时,{mylist}weight_*
是可接受的模式,而模式 {abc}weight_*
将被拒绝,导致命令失败并报错。
要使用带有哈希标签的模式,请参阅哈希标签获取更多信息。
任何引用外部键模式的 GET
或 BY
用法只有在运行命令的当前用户拥有完整键读取权限时才被允许。可以通过例如,在相关的命令访问规则中指定 '%R~*'
或 '~*
来为用户设置完整键读取权限。您可以查看 ACL SETUSER
命令手册以获取有关设置 ACL 访问规则的更多信息。如果未设置完整键读取权限,命令将失败并报错。
存储 SORT 操作的结果
默认情况下,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
字符串 ->
用于将键名与哈希字段名分开。键按上述文档替换,然后访问存储在结果键处的哈希以检索指定的哈希字段。
RESP2/RESP3 回复
数组回复:不传递 STORE 选项时,命令返回一个排序后的元素列表。
整数回复:指定 STORE 选项时,命令返回目标列表中排序元素的数量。