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 文档许可。