排序

语法
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern
  ...]] [ASC | DESC] [ALPHA] [STORE destination]
自版本
1.0.0
时间复杂度
O(N+M*log(M)),其中 N 是要排序的列表或集合中的元素数量,M 是返回的元素数量。当元素没有排序时,复杂度为 O(N)。
ACL 类别
@write, @set, @sortedset, @list, @slow, @dangerous,

返回或存储包含在 列表集合有序集合 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

按外部键排序

有时您希望使用外部键作为权重进行排序,而不是比较列表、集合或有序集合中的实际元素。假设列表 mylist 包含元素 123,代表存储在 object_1object_2object_3 中的对象的唯一 ID。当这些对象具有存储在 weight_1weight_2weight_3 中的关联权重时,SORT 可以被指示使用这些权重对 mylist 进行排序,如下所示

SORT mylist BY weight_*

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

跳过元素排序

BY 选项也可以接受一个不存在的键,这将导致 SORT 跳过排序操作。如果您希望检索外部键(请参阅下面的 GET 选项)而不必进行排序,这将非常有用。

SORT mylist BY nosort

检索外部键

我们之前的示例只返回排序后的 ID。在某些情况下,获取实际对象而不是它们的 ID(object_1object_2object_3)更为有用。可以使用以下命令检索基于列表、集合或有序集合中的元素的外部键

SORT mylist BY weight_* GET object_*

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

还可以使用特殊模式 # GET 元素本身

SORT mylist BY weight_* GET object_* GET #

使用外部键的限制

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

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

若要使用带哈希标签的模式,请参阅哈希标签以获取更多信息。

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

存储 SORT 操作的结果

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

SORT mylist BY weight_* STORE resultkey

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

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

BYGET中使用哈希

可以使用以下语法对哈希字段使用BYGET选项:

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

字符串->用于分隔键名和哈希字段名。键将如上所述进行替换,并且访问结果键中存储的哈希以检索指定的哈希字段。

RESP2/RESP3 回复

数组回复:不传递STORE选项时,命令将返回一个排序元素列表。 整数回复:指定STORE选项时,命令将返回目标列表中排序元素的数量。
RATE THIS PAGE
Back to top ↑