Redis 中的排序与其他语言中的排序类似:我们希望获取一系列项目并根据元素之间的某些比较对其进行排序。SORT 允许我们根据 LIST/SET/ZSET 数据中存储的数据对 LIST、SET 和 ZSET 进行排序,这些数据存储在 STRING 键中,甚至存储在 HASH 中。如果您有关系数据库背景,您可以将 SORT 视为 SQL 语句中的 order by 子句,它可以引用其他行和表。表 3.12 显示了 SORT 命令定义。
命令 | 示例用法和描述 |
---|---|
SORT | SORT source-key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC|DESC] [ALPHA] [STORE dest-key] — 根据提供的选项对输入 LIST、SET 或 ZSET 进行排序,并返回或存储结果 |
使用 SORT 的一些更基本选项包括能够以降序而不是默认升序排列结果,将项目视为数字,将项目视为二进制字符串进行比较(字符串 ‘110’ 和 ’12’ 的排序顺序与数字 110 和 12 的排序顺序不同),按未包含在原始序列中的值排序,甚至获取输入 LIST、SET 或 ZSET 之外的值。
您可以在清单 3.12 中看到一些使用 SORT 的示例。清单的前几行显示了一些初始数据的添加和基本排序(按数值和字符串顺序)。其余部分显示了我们如何使用特殊语法将要排序和/或获取的数据存储在 HASH 中。
>>> conn.rpush('sort-input', 23, 15, 110, 7) 4
首先将一些项目添加到 LIST。
>>> conn.sort('sort-input') ['7', '15', '23', '110']
我们可以按数值对项目进行排序。
>>> conn.sort('sort-input', alpha=True) ['110', '15', '23', '7']
我们可以按字母顺序对项目进行排序。
>>> conn.hset('d-7', 'field', 5) 1L >>> conn.hset('d-15', 'field', 1) 1L >>> conn.hset('d-23', 'field', 9) 1L >>> conn.hset('d-110', 'field', 3) 1L
我们只是为排序和获取添加一些额外数据。
>>> conn.sort('sort-input', by='d-*->field') ['15', '110', '7', '23']
我们可以按 HASH 的字段对数据进行排序。
>>> conn.sort('sort-input', by='d-*->field', get='d-*->field') ['1', '3', '5', '9']
我们甚至可以获取该数据并返回它,而不是或除了我们的输入数据。
排序可用于对 LIST 进行排序,但它也可以对 SET 进行排序,从而将结果转换为 LIST。在此示例中,我们按字符(通过 alpha 关键字参数)对数字进行排序,我们基于外部数据对某些项目进行排序,甚至能够获取外部数据以返回。当与 SET 交集、并集和差集以及将数据外部存储在 HASH 中相结合时,SORT 是一个强大的命令。我们将在第 7 章花一些时间讨论如何将 SET 操作与 SORT 结合使用。
虽然 SORT 是唯一可以同时操作三种类型数据的命令,但基本的 Redis 事务可以让您通过一系列命令无中断地操作多种数据类型。