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 命令的各种选项时我们会看到这一点。
- 介绍
- 前言
- 致谢
- 简介
- 第一部分:数据结构与对象
- 简单动态字符串
- SDS 的定义
- SDS 与 C 字符串的区别
- SDS API
- 重点回顾
- 参考资料
- 链表
- 链表和链表节点的实现
- 链表和链表节点的 API
- 重点回顾
- 字典
- 字典的实现
- 哈希算法
- 解决键冲突
- rehash
- 渐进式 rehash
- 字典 API
- 重点回顾
- 跳跃表
- 跳跃表的实现
- 跳跃表 API
- 重点回顾
- 整数集合
- 整数集合的实现
- 升级
- 升级的好处
- 降级
- 整数集合 API
- 重点回顾
- 压缩列表
- 压缩列表的构成
- 压缩列表节点的构成
- 连锁更新
- 压缩列表 API
- 重点回顾
- 对象
- 对象的类型与编码
- 字符串对象
- 列表对象
- 哈希对象
- 集合对象
- 有序集合对象
- 类型检查与命令多态
- 内存回收
- 对象共享
- 对象的空转时长
- 重点回顾
- 第二部分:单机数据库的实现
- 数据库
- 数据库键空间
- 重点回顾
- RDB 持久化
- RDB 文件结构
- 重点回顾
- AOF 持久化
- AOF 持久化的实现
- 重点回顾
- 事件
- 文件事件
- 重点回顾
- 参考资料
- 客户端
- 客户端属性
- 重点回顾
- 服务器
- 命令请求的执行过程
- 重点回顾
- 第三部分:多机数据库的实现
- 复制
- 旧版复制功能的实现
- 重点回顾
- Sentinel
- 启动并初始化 Sentinel
- 重点回顾
- 参考资料
- 集群
- 节点
- 重点回顾
- 第四部分:独立功能的实现
- 发布与订阅
- 频道的订阅与退订
- 重点回顾
- 参考资料
- 事务
- 事务的实现
- 重点回顾
- Lua 脚本
- 创建并修改 Lua 环境
- 重点回顾
- 排序
- SORT <key> 命令的实现
- 重点回顾
- 二进制位数组
- GETBIT 命令的实现
- 重点回顾
- 慢查询日志
- 慢查询记录的保存
- 慢查询日志的阅览和删除
- 添加新日志
- 重点回顾
- 监视器
- 成为监视器
- 向监视器发送命令信息
- 重点回顾
- 源码、相关资源和勘误