文章目录
- 简介
- SORT命令的实现
- ALPHA选项的实现
- ASC和DESC
- BY
- LIMIT
- GET命令 类似映射
- STORE选项的实现
- 多个命令的执行顺序
简介
Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。
SORT命令的实现
服务器执行SORT numbers 命令的详细步骤如下:
1)创建一个个和numbers列表长度相同的数组,该数组的每个项都是个redis.h/redis SortObject结枸,如图
2)通历数组,将各个数组项的obj指针分别指向numbers列表的各个项,构成obj指针和列表项之间的一对一关系。
3)遍历数组,将各个obj指针所指向的列表项转换成一个double类型的浮点数,并将这个浮点数保存在相应数组项的u.score属性里面。
4)根据数组项u.score屆性的值,对数组进行数字值排序,排序后的数组项按u.score属性的值从小到大排列,如图所示。
5)遍历数组,将各个数组项的obj指针所指向的列表项作为排序结果返回给客户端,程序首先访问数组的索引0,返回u.score值为1.0的列表项"1";然后访问数组的索引1,返回u.score值为2.0的列表项"2";最后访问数组的索引2,返回u.score值为3.0的列表项"3”。
其他SORT<key>
命令的执行步骤也和这里给出的SORTnumber命令的执行步骤类似。
ALPHA选项的实现
通过使用ALPHA选项,SORT命令可以对包含字符串值的键进行排序:
SORT <key> ALPHA
服务器执行SORT fruits ALPHA命令的详细步骤如下:
1)创建一个redis SortObject结构数组,数组的长度等于fruits集合的大小。
2)遍历数组,将各个数组项的obi指针分别指向fruits集合的各个元素。
3)根据obj指针所指向的集合元素,对数组进行字符串排序,排序后的数组项按集合元素的字符串值从小到大排列。这里类似于Java的字符串排序。
4)遍历数组,依次将数组项的obi指针所指向的元素返回给客户端。
ASC和DESC
SORT <key> ASC/DESC
// 默认ASC
// 实现类似于Comparetor
BY
1.RPUSH fruit apple banana cherry
// 其实就是一次性塞入多个key-value
2.MSET apple-price 8 banana-price 5.5 cherry-price 7
// 排序
3.SORT fruit by *-price
//用ALPHA同理 在最后加上ALPHA就行
LIMIT
SORT key by pattern LIMIT offset count
GET命令 类似映射
通过使用GET选项,我们可以让SORT命令在对键进行排序 之后,根据被排序的元素,以及GET选项所指定的模式,查找并返回某 些键的值。
STORE选项的实现
在默认情况下,SORT命令只向客户端返回排序结果,而不保存排序结果。但是,通过使用STORE选项,我们可以将排序结果保存在指定的键里面,并在有需要时重用这个排序结果:
SORT key STORE new_key
多个命令的执行顺序
如果按照选项来划分的话,一个SORT命令的执行过程可以分为以下四步:
1)排序:在这一步,命令会使用ALPHA、ASC或DESC、BY这几 个选项,对输入键进行排序,并得到一个排序结果集。
2)限制排序结果集的长度:在这一步,命令会使用LIMIT选项, 对排序结果集的长度进行限制,只有LIMIT选项指定的那部分元素会被 保留在排序结果集中。
3)获取外部键:在这一步,命令会使用GET选项,根据排序结果 集中的元素,以及GET选项指定的模式,查找并获取指定键的值,并用 这些值来作为新的排序结果集。
4)保存排序结果集:在这一步,命令会使用STORE选项,将排序 结果集保存到指定的键上面去。
5)向客户端返回排序结果集:在最后这一步,命令遍历排序结果集,并依次向客户端返回排序结果集中的元素。
执行命令:
SORT <key> ALPHA DESC BY <by-pattern> LIMIT <offset> <count> GET <get- pattern> STORE <store_key>
顺序:
1. SORT <key> ALPHA DESC BY <by-pattern>
2. LIMIT <offset> <count>
3. GET <get-pattern>
4. STORE <store_key>