redis的SORT命令可以对列表键,集合键或者有序集合键的值进行排序,其底层实现如下:
SORT numbers
1. 创建一个和参数列表等长的数组,该数组的每一项都是redisSortObject结构
-
typedef struct _redisSortObject {
-
robj *obj;
-
union {
-
double score;// 排序数字值时使用
-
robj *cmpobj;// 排序带有by选项的字符串值时使用
-
} u;
-
} redisSortObject;
2. 遍历数组,将各个数组的obj指针分别指向numbers列表的各个项,构成obj指针和列表项之间的一对一关系
3. 遍历数组,将各个obj指针所指向的列表项转换成一个double类型的浮点数,并将这个浮点数保存在相应数组项的u.score里面
4. 根据数组项u.score属性的值,对数组进行数字值排序,排序后的数组项按照u.score属性从小到大排列
5. 遍历数组,将各个数组想的obj指针所指向的列表项作为排序结果返回给客户端
其中各种命令的选项,均在score和cmpobj上面做文章,obj始终指向要被排序的对象
其选项的执行顺序为(选项的输入先后顺序不影响执行顺序):
1. 排序:ALPHA, ASC, DESC, BY
2. 限制排序结果集的长度
2. 获取外部键
4. 保存排序结果集STORE
5. 向客户端返回排序结果
阅读(1155) | 评论(0) | 转发(0) |