排序
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_ROread-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在此示例中)。
跳过元素排序
这BYoption 也可以采用不存在的 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包括将EXPIREtimeout 添加到结果键中,以便在结果显示
的SORT作可以缓存一段时间。
其他客户端将使用缓存列表,而不是调用SORT对于每个
请求。
当密钥超时时,可以通过以下方式创建缓存的更新版本
叫SORT ... STORE再。
请注意,要正确实现此模式,请务必避免
多个客户端同时重建缓存。
这里需要某种类型的锁定(例如,使用SETNX).
在 中使用哈希BY和GET
可以使用BY和GET选项对哈希字段使用
以下语法:
SORT mylist BY weight_*->fieldname GET object_*->fieldname
该字符串用于将键名称与哈希字段名称分开。
密钥如上所述被替换,哈希值存储在生成的
key 来检索指定的哈希字段。->