- sort命令可对集合、列表和有序集合排序,对有序集合排序,默认使用集合的key而不是score作为排序依据
- 命令格式:
SORT <key> [ALPHA] [ASC|DESC] [BY <by-pattern>] [LIMIT <offset> <count>] [GET <get-pattern> [...<get-pattern>] [STORE <store-key>]
- 执行顺序:sort alpha asc|desc by第一步执行,得到排序结果;然后limit限制长度;然后执行GET,得到新的排序结果;然后执行STORT,保存排序结果;最后将结果返回给客户端
命令各字段讲解
- ALPHA:是否使用字典序排序,出现则使用字典序,不出现是只能对数字排序
- ASC|DESC:升序还是降序
- BY:使用外部键值辅助排序,比如by -price,说明,排序的大小并非key对应的val的大小,而是by后面的模式key对应val的大小。-price将匹配到原来的各val,得到’val-price’的新键,然后根据新的键,找到对应的新val,按各个新的val给旧val排序
- LIMIT:和mysql的一样
- GET:一般来讲,排序后返回的是排序键对应的值,但是如果向返回匹配值的某一模式的其他键的数据,可以使用GET,比如 get *-price,排序后的val将拼成新key’val-price’,然后取到新key对应的新val,按序返回
- STORE:如果排序后的数据打算存储,那么可以使用STORE关键字,后接存储指定的key
实现
- sort会用到一个新的结构体
redisSortObject
,这个结构体内包含一个指向redisObject的指针obj
,一个保存浮点数的域u.score
。排序时,首先创建一个和待排数据容量一样大的redisSortObject数组。对于其中每一个元素, 将obj指针指向待排序数据,然后对u.score
使用待排数据赋值,然后利用u.socre
排序,最后读结果时,通过obj
指针读实际数据返回。 - 当使用ALPHA排序字母时,
u.score
不使用,直接通过obj指针,访问待排数据本身,给redisSortObject
做排序 - 当使用BY的时候,
u.score
保存BY的模式key对应的val,按u.score
排序redisSortObject
数组 - 当一起使用BY和ALPHA,用外部键值字母排序时:使用
u
的另一个成员u.cmpobj
指向外部键对应的值,排序时,使用u.cmpobj
排序redisSortObject
数组,然后使用obj
指针遍历访问实际值返回 - 使用GET字段时,之前的步骤不变,最后使用obj访问实际数据这一步改为:使用obj访问实际数据,然后匹配GET模式,再次访问数据库,得到目的数据