排序
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]
- Available since:
- 1.0.0
- Time complexity:
- O(N+M*log(M)) where N is the number of elements in the list or set to sort, and M the number of returned elements. When the elements are not sorted, complexity is O(N).
- ACL categories:
-
@write
,@set
,@sortedset
,@list
,@slow
,@dangerous
,
返回或存储在key
处的list、set或sorted set中包含的元素。
此命令还有一个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
包含元素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}weight_*
在排序mylist
时是可以接受的模式,而模式{abc}weight_*
将被拒绝,导致命令失败并报错。
要使用带有哈希标签的模式,请参阅哈希标签了解更多信息。
从 Redis 7.0 开始,任何使用 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
字符串 ->
用于将键名与哈希字段名分开。
键按照上述文档进行替换,并访问存储在结果键中的哈希以检索指定的哈希字段。