*Redis sort 命令
*语法
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern
...]] [ASC | DESC] [ALPHA] [STORE destination]
返回或存储 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 包含元素 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 集群模式 时,无法保证外部键存在于处理命令的节点上。在这种情况下,任何使用 GET 或 BY 引用外部键模式的操作都会导致命令失败并返回错误。
从 7.4 开始,包含哈希标签的模式可以映射到槽,因此在 Redis 集群模式 中,当模式包含哈希标签并暗示键也在其中的特定槽时,允许使用 BY 或 GET,这意味着任何匹配此模式的键必须与键在同一个槽中,因此也在同一个节点上。例如,在集群模式下,当排序 mylist 时,{mylist}weight_* 是可以接受的模式,而模式 {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 ... STORE 来创建缓存的更新版本。
注意,为了正确实现此模式,重要的是避免多个客户端同时重建缓存。这里需要某种锁定(例如使用 SETNX)。
*在 BY 和 GET 中使用哈希
可以使用以下语法针对哈希字段使用 BY 和 GET 选项:
SORT mylist BY weight_*->fieldname GET object_*->fieldname
字符串 -> 用于分隔键名和哈希字段名。键按照上述文档替换,并访问结果键处存储的哈希以检索指定的哈希字段。
*返回信息
Array reply: 未传递 STORE 选项时,命令返回排序后的元素列表。 Integer reply: 指定了 STORE 选项时,命令返回目标列表中排序后的元素数量。