redis排序使用sort命令。能够对列表键、集合键或者有序集合键的值进行排序。
几个简单的例子:(1)对列表键的值进行排序(数值列表)127.0.0.1:6379> rpush numbers 1 4 8 2 3 9 4(integer) 7127.0.0.1:6379> lrange numbers 0 -11) "1"2) "4"3) "8"4) "2"5) "3"6) "9"7) "4"127.0.0.1:6379> sort numbers1) "1"2) "2"3) "3"4) "4"5) "4"6) "8"7) "9"(2)对列表键的值进行排序(字符列表)127.0.0.1:6379> rpush charlist a g b d s f(integer) 6127.0.0.1:6379> lrange charlist 0 -11) "a"2) "g"3) "b"4) "d"5) "s"6) "f"127.0.0.1:6379> sort charlist alpha1) "a"2) "b"3) "d"4) "f"5) "g"6) "s"(3)对列表键的值进行排序(字符串列表)127.0.0.1:6379> lpush stringlist "abc" "sdf" "123sdf" "sssfadf"(integer) 4127.0.0.1:6379> lrange stringlist 0 -11) "sssfadf"2) "123sdf"3) "sdf"4) "abc"127.0.0.1:6379> sort stringlist alpha1) "123sdf"2) "abc"3) "sdf"4) "sssfadf"(4)对集合键进行排序(字符集合)127.0.0.1:6379> sadd charset a f s r c b(integer) 6127.0.0.1:6379> smembers charset1) "c"2) "s"3) "r"4) "b"5) "a"6) "f"127.0.0.1:6379> sort charset alpha1) "a"2) "b"3) "c"4) "f"5) "r"6) "s"127.0.0.1:6379>(5)BY 选项初探。使用sort命令的by选项以jack_number , peter_number , tom_number三个键的值为权重,对有序集合test_result中的“jack” , “Peter” , “tom”三个成员进行排序。127.0.0.1:6379> zadd test-result 3.0 jack 3.5 peter 4.0 tom(integer) 3127.0.0.1:6379> zrange test-result 0 -11) "jack"2) "peter"3) "tom"127.0.0.1:6379> mset peter_number 1 tom_number 2 jack_number 3OK127.0.0.1:6379> sort test-result by *_number1) "peter"2) "tom"3) "jack"127.0.0.1:6379>以下介绍包括sort命令及其选项(ASC , DESC , ALPHA , LIMIT , STORE , BY , GET)原理。1、SORT <key> 作用:主要可对包含数值键的key进行排序。 示例:sort numbers 原理:以列表为例,目标列表numbers 1)创建于numbers列表长度相同的数组。数组中每个节点结构有两个属性(指针,浮点)。 2)遍历数组,将各个数组项指针指向numbers各个节点,建立一对一关系。 3)遍历数组,将各个指针所指向的列表项转换成一个double类型的值存储在数组项中。 4)根据浮点值进行数组排序。 5)从数组0位开始遍历数组,将指针所指列表项的值返回给客户端。 注意:SORT命令为排序键创建长度相同的数组键。 数组项使用的数据结构是:redisSortObject。 根据SORT选项的不同,使用redisSortObject的方式也不同。2、ALPHA选项 作用:使用该选项,SORT命令可以对包含字符串值得key进行排序。 示例:sort fruits alpha 原理:以集合为例,目标集合fruits。 1)创建redisSortObject结构数组,长度与fruits长度相同。 2)遍历数组,将数组各项指针指向fruits集合中各个元素。 3)根据集合内字符串元素对数组进行排序。 4)从数组0位开始遍历数组,将指针所指列表项的值返回给客户端。 注意:使用该选项未使用redisSortObject中的浮点属性。3、ASC、DESC选项 作用:对排序后的结果集进行升序(ASC)或降序(DESC)排列。主要可对包含数值键的key。 示例:sort numbers asc/desc 原理:与SORT <key>原理基本相同 注意:均使用快排。 升序时使用对比函数产生升序对比结果。 降序时使用对比函数产生降序对比结果。4、BY选项 作用:SORT命令可以制定某些字符串键,或者某个哈希键所包含的某些域来作为元素的权重,对一个键进行排序。 默认情况下SORT命令使用被排序键所包含的元素作为排序的权重,元素本身决定了元素在排序后所处的位置。 示例:SORT <key> BY <pattern> 原理:以列表为例,目标列表fruits。 1)创建redisSortObject结构数组,长度与fruits长度相同。 2)遍历数组,将数组各项指针指向fruits列表中各个元素。 3)遍历数组,根据各个数组项指针所指的列表元素,以及BY选项所制定的模式(*-price),查找相应的权重键。 4)将各个权重键的值保存在数组浮点属性中。 5)根据数组各项权重值对数组进行排序。 6)从数组0位开始遍历数组,将指针所指列表项的值返回给客户端。5、带ALPHA的BY选项 作用:单纯的BY选项默认假设权重键保存的值为数值。如果值为字符串,就需要ALPHA的配合。 示例:SORT <key> BY <pattern> ALPHA 原理:原理与BY选项基本相同。不同点在第五步,是对字符串还是数值进行排序。6、LIMIT选项 作用:返回SORT命令排序后的结果集的一部分,类似一次分页查找。 示例:SORT alphabet ALPHA LIMIT 0 4 , SORT alphabet ALPHA LIMIT 2 4 原理:原理与其他SORT命令基本相同,不同点在于返回数据给客户端时按照LIMIT的两个参数(LIMIT <offset count>)限制结果集大小。7、GET选项 作用:SORT对键进行排序后,根据被排序的元素,以及GET选项所制定的模式,查找并返回某些键的值。 示例:SORT students ALPHA GET *-name(SORT <KEY> OPTIONS GET <PATTERN>) 原理: 1)创建redisSortObject结构数组,长度与students集合大小相同。 2)遍历数组,将数组各项指针指向students集合中各个元素。 3)根据GET选项前的参数进行排序操作。 4)遍历数组,根据指针元素所指向的集合元素,以及GET选项所给定的模式,查找相应的键。 5)遍历查找之前返回的键,进而返回值。 注意:可以同时存在多个GET,通过遍历排序后的结果集,多个GET依次获取键值并返回给客户端。 实验:实验7.18、STORE选项 作用:将SORT选项排序后的结果集存储到其他key中。 示例:SORT numberset STORE temp 原理:排序后将结果集放入列表中。 注意:只能放入列表中,若制定的目标类型非列表,redis进行数据结构调整(之前的数据清除)。9、选项执行顺序 SORT命令执行步骤: 1)排序:ALPAH,ASC/DESC,BY 2)限制结果集:LIMIT选项 3)获取外部键:GET 4)保存排序结果集:STORE 5)返回客户端结果 redis按照以上步骤执行SORT命令,因此与选项拜访顺序基本无关,但是多个GET选项除外。 注意:GET选项的摆放顺序决定返回客户端结果集的结构一致性。附录:实验7.1127.0.0.1:6379> sadd students "peter" "jack" "tom"(integer) 3127.0.0.1:6379> smembers students1) "jack"2) "peter"3) "tom"127.0.0.1:6379> mset peter-name "Peter White" jack-name "Jack Snow" tom-name "Tom Smith"OK127.0.0.1:6379> sort students alpha get *-name1) "Jack Snow"2) "Peter White"3) "Tom Smith"127.0.0.1:6379> mset peter-birth "2016/3/15 22:53:01" jack-birth "2016/3/13 22:53:12" tom-birth "2016/3/16 22:53:15"OK127.0.0.1:6379> sort students alpha get *-name get *-birth1) "Jack Snow"2) "2016/3/13 22:53:12"3) "Peter White"4) "2016/3/15 22:53:01"5) "Tom Smith"6) "2016/3/16 22:53:15"127.0.0.1:6379>实验8.1127.0.0.1:6379> lrange charlist 0 -11) "a"2) "g"3) "b"4) "d"5) "s"6) "f"127.0.0.1:6379> del temp(integer) 1127.0.0.1:6379> sadd temp "asdffasdf"(integer) 1127.0.0.1:6379> smembers temp1) "asdffasdf"127.0.0.1:6379> sort charlist alpha store temp(integer) 6127.0.0.1:6379> type charlistlist127.0.0.1:6379> type templist127.0.0.1:6379> sort charset alpha store temp(integer) 6127.0.0.1:6379> type charsetset127.0.0.1:6379> smembers temp(error) WRONGTYPE Operation against a key holding the wrong kind of value127.0.0.1:6379> lrange temp 0 -11) "a"2) "b"3) "c"4) "f"5) "r"6) "s"127.0.0.1:6379>