多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
SORT 命令的最简单执行形式为: ~~~ SORT <key> ~~~ 这个命令可以对一个包含数字值的键 `key` 进行排序。 以下示例展示了如何使用 SORT 命令对一个包含三个数字值的列表键进行排序: ~~~ redis> RPUSH numbers 3 1 2 (integer) 3 redis> SORT numbers 1) "1" 2) "2" 3) "3" ~~~ 服务器执行 `SORT numbers` 命令的详细步骤如下: 1. 创建一个和 `numbers` 列表长度相同的数组, 该数组的每个项都是一个 `redis.h/redisSortObject` 结构, 如图 IMAGE_CREATE_ARRAY 所示。 2. 遍历数组, 将各个数组项的 `obj` 指针分别指向 `numbers` 列表的各个项, 构成 `obj` 指针和列表项之间的一对一关系, 如图 IMAGE_POINT_OBJ 所示。 3. 遍历数组, 将各个 `obj` 指针所指向的列表项转换成一个 `double` 类型的浮点数, 并将这个浮点数保存在相应数组项的 `u.score` 属性里面, 如图 IMAGE_SET_SCORE 所示。 4. 根据数组项 `u.score` 属性的值, 对数组进行数字值排序, 排序后的数组项按 `u.score` 属性的值从小到大排列, 如图 IMAGE_SORTED 所示。 5. 遍历数组, 将各个数组项的 `obj` 指针所指向的列表项作为排序结果返回给客户端: 程序首先访问数组的索引 `0` , 返回 `u.score` 值为`1.0` 的列表项 `"1"` ; 然后访问数组的索引 `1` , 返回 `u.score` 值为 `2.0` 的列表项 `"2"` ; 最后访问数组的索引 `2` , 返回 `u.score` 值为`3.0` 的列表项 `"3"` 。 其他 `SORT <key>` 命令的执行步骤也和这里给出的 `SORT numbers` 命令的执行步骤类似。 ![](https://box.kancloud.cn/2015-09-13_55f52c5ee7750.png) ![](https://box.kancloud.cn/2015-09-13_55f52c612e4a6.png) ![](https://box.kancloud.cn/2015-09-13_55f52c6296d2b.png) ![](https://box.kancloud.cn/2015-09-13_55f52c63dfd57.png) 以下是 `redisSortObject` 结构的完整定义: ~~~ typedef struct _redisSortObject { // 被排序键的值 robj *obj; // 权重 union { // 排序数字值时使用 double score; // 排序带有 BY 选项的字符串值时使用 robj *cmpobj; } u; } redisSortObject; ~~~ SORT 命令为每个被排序的键都创建一个与键长度相同的数组, 数组的每个项都是一个 `redisSortObject` 结构, 根据 SORT 命令使用的选项不同, 程序使用 `redisSortObject` 结构的方式也不同, 稍后介绍 SORT 命令的各种选项时我们会看到这一点。