redis排序使用sort命令。能够对列表键、集合键或者有序集合键的值进行排序。
几个简单的例子:
(1)对列表键的值进行排序(数值列表)
127.0.0.1:6379> rpush numbers 1 4 8 2 3 9 4
(integer) 7
127.0.0.1:6379> lrange numbers 0 -1
1) "1"
2) "4"
3) "8"
4) "2"
5) "3"
6) "9"
7) "4"
127.0.0.1:6379> sort numbers
1) "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) 6
127.0.0.1:6379> lrange charlist 0 -1
1) "a"
2) "g"
3) "b"
4) "d"
5) "s"
6) "f"
127.0.0.1:6379> sort charlist alpha
1) "a"
2) "b"
3) "d"
4) "f"
5) "g"
6) "s"
(3)对列表键的值进行排序(字符串列表)
127.0.0.1:6379> lpush stringlist "abc" "sdf" "123sdf" "sssfadf"
(integer) 4
127.0.0.1:6379> lrange stringlist 0 -1
1) "sssfadf"
2) "123sdf"
3) "sdf"
4) "abc"
127.0.0.1:6379> sort stringlist alpha
1) "123sdf"
2) "abc"
3) "sdf"
4) "sssfadf"
(4)对集合键进行排序(字符集合)
127.0.0.1:6379> sadd charset a f s r c b
(integer) 6
127.0.0.1:6379> smembers charset
1) "c"
2) "s"
3) "r"
4) "b"
5) "a"
6) "f"
127.0.0.1:6379> sort charset alpha
1) "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) 3
127.0.0.1:6379> zrange test-result 0 -1
1) "jack"
2) "peter"
3) "tom"
127.0.0.1:6379> mset peter_number 1 tom_number 2 jack_number 3
OK
127.0.0.1:6379> sort test-result by *_number
1) "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.1
8、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.1
127.0.0.1:6379> sadd students "peter" "jack" "tom"
(integer) 3
127.0.0.1:6379> smembers students
1) "jack"
2) "peter"
3) "tom"
127.0.0.1:6379> mset peter-name "Peter White" jack-name "Jack Snow" tom-name "Tom Smith"
OK
127.0.0.1:6379> sort students alpha get *-name
1) "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"
OK
127.0.0.1:6379> sort students alpha get *-name get *-birth
1) "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.1
127.0.0.1:6379> lrange charlist 0 -1
1) "a"
2) "g"
3) "b"
4) "d"
5) "s"
6) "f"
127.0.0.1:6379> del temp
(integer) 1
127.0.0.1:6379> sadd temp "asdffasdf"
(integer) 1
127.0.0.1:6379> smembers temp
1) "asdffasdf"
127.0.0.1:6379> sort charlist alpha store temp
(integer) 6
127.0.0.1:6379> type charlist
list
127.0.0.1:6379> type temp
list
127.0.0.1:6379> sort charset alpha store temp
(integer) 6
127.0.0.1:6379> type charset
set
127.0.0.1:6379> smembers temp
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lrange temp 0 -1
1) "a"
2) "b"
3) "c"
4) "f"
5) "r"
6) "s"
127.0.0.1:6379>