排序
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
,
返回或存储 list、set 或 sorted set 中包含的元素key
.
还有SORT_RO
read-only 变体。
默认情况下,排序为数字,元素按其值进行比较
解释为双精度浮点数。
这是SORT
最简单的形式:
SORT mylist
若mylist
是一个数字列表,此命令将返回相同的列表
元素从小到大排序。
为了将数字从大到小排序,请使用DESC
修饰语:
SORT mylist DESC
什么时候mylist
包含字符串值,并且您希望对它们进行排序
按字典顺序,使用ALPHA
修饰语:
SORT mylist ALPHA
Redis 是 UTF-8 感知的,假设您正确地将LC_COLLATE
环境
变量。
可以使用LIMIT
修饰语。
此修饰符采用offset
参数,指定要
skip 和count
参数,指定要从中返回的元素数
起价offset
.
以下示例将返回 的 排序版本的 10 个元素mylist
,
从元素 0 (offset
从 0 开始):
SORT mylist LIMIT 0 10
几乎所有修饰符都可以一起使用。 以下示例将返回前 5 个元素,按字典顺序排序 按降序排列:
SORT mylist LIMIT 0 5 ALPHA DESC
按外部键排序
有时你想使用外部键作为权重对元素进行排序以进行比较
而不是比较 list、set 或 sorted set 中的实际元素。
假设列表mylist
包含元素1
,2
和3
代表
存储在 中的对象的唯一 IDobject_1
,object_2
和object_3
.
当这些对象具有存储在weight_1
,weight_2
和weight_3
,SORT
可以指示使用这些权重进行排序mylist
跟
以下语句:
SORT mylist BY weight_*
这BY
选项采用模式(等于weight_*
在本例中),即
用于生成用于排序的键。
这些键名称是通过将第一次出现的 替换为
列表中元素的实际值 (*
1
,2
和3
在此示例中)。
跳过元素排序
这BY
option 也可以采用不存在的 key,这会导致SORT
跳过
排序作。
如果您想检索外部密钥(请参阅GET
选择
),而无需排序的开销。
SORT mylist BY nosort
检索外部密钥
我们前面的示例仅返回排序的 ID。
在某些情况下,获取实际对象而不是其 ID 更有用
(object_1
,object_2
和object_3
).
根据 list、set 或 sorted set 中的元素检索外部键可以
使用以下命令完成:
SORT mylist BY weight_* GET object_*
这GET
选项可以多次使用,以便为每个
元素。
也可以GET
元素本身使用特殊模式:#
SORT mylist BY weight_* GET object_* GET #
使用外部键的限制
在 7.4 之前,启用Redis cluster-mode
无法保证处理命令的节点上存在外部密钥。在这种情况下,任何对GET
或BY
哪个引用外部键模式将导致命令失败并出现错误。
从 7.4 开始,带有 hash 标签的 pattern 可以映射到 slot 中,依此类推Redis cluster-mode
,使用BY
或GET
当 pattern 包含哈希标签并暗示 key 所在的特定 slot 时,允许,这意味着与此模式匹配的任何 key 必须与 key 位于同一 slot 中,因此位于同一节点中。例如,在集群模式下,{mylist}weight_*
在排序时可以作为模式mylist
,而模式{abc}weight_*
将被拒绝,从而导致命令失败并出现错误。
要将 pattern 与哈希标签一起使用,请参阅哈希标签了解更多信息。
从 Redis 7.0 开始,任何对GET
或BY
仅当运行该命令的当前用户具有完全密钥读取权限时,才允许使用哪种引用外部密钥模式。
可以为用户设置完全密钥读取权限,例如,通过指定'%R~*'
或使用相关的命令访问规则。
您可以查看'~*
ACL SETUSER
命令手册,了解有关设置 ACL 访问规则的更多信息。
如果未设置完全密钥读取权限,则命令将失败并显示错误。
存储 SORT作的结果
默认情况下,SORT
将排序的元素返回给客户端。
使用STORE
选项,结果将以列表形式存储在指定的
key 而不是返回给客户端。
SORT mylist BY weight_* STORE resultkey
一个有趣的模式SORT ... STORE
包括将EXPIRE
timeout 添加到结果键中,以便在结果显示
的SORT
作可以缓存一段时间。
其他客户端将使用缓存列表,而不是调用SORT
对于每个
请求。
当密钥超时时,可以通过以下方式创建缓存的更新版本
叫SORT ... STORE
再。
请注意,要正确实现此模式,请务必避免
多个客户端同时重建缓存。
这里需要某种类型的锁定(例如,使用SETNX
).
在 中使用哈希BY
和GET
可以使用BY
和GET
选项对哈希字段使用
以下语法:
SORT mylist BY weight_*->fieldname GET object_*->fieldname
该字符串用于将键名称与哈希字段名称分开。
密钥如上所述被替换,哈希值存储在生成的
key 来检索指定的哈希字段。->