Redis有着list、set、zset等数据类型,对数据进行存储时非常方便,这些数据类型也有着许多功能强大的操作命令,但是其返回结果是无序的,而Redis中的排序命令(sort)则可以对list、set、zset等类型的key进行排序,可以实现与关系数据库中查询类似的功能。
命令:sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
sort key [ASC|DESC]
使用纯数字的list来解释下这个命令,默认情况下按照数字的升序排序
127.0.0.1:6379> lpush list 22 51 13 80
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "80"
2) "13"
3) "51"
4) "22"
127.0.0.1:6379> sort list
1) "13"
2) "22"
3) "51"
4) "80"
127.0.0.1:6379> sort list desc
1) "80"
2) "51"
3) "22"
4) "13"
[ALPHA]
对于元素不全是数字的数据类型来说,想要使用sort命令排序必须加上 [ALPHA],默认情况是数字在前(数组升序),字母按照升序排列。
127.0.0.1:6379> lpush list1 sss stop aaa 12 39
(integer) 5
127.0.0.1:6379> sort list1
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> sort list1 alpha
1) "12"
2) "39"
3) "aaa"
4) "sss"
5) "stop"
127.0.0.1:6379> sort list1 alpha desc
1) "stop"
2) "sss"
3) "aaa"
4) "39"
5) "12"
[BY pattern]
这个命令与关系型数据库中的order by作用类似,区别在于:redis的sort命令by只能有一个参数,关系型数据库中能有多个参数,下面举个例子:
students | ||||
id | name | age | hobby | score |
1 | su | 20 | football | 85 |
2 | xie | 22 | basketball | 93 |
3 | qin | 21 | tennis | 88 |
127.0.0.1:6379> zadd students 1 su 2 xie 3 qin
(integer) 3
127.0.0.1:6379> hmset student:su age 20 hobby football score 85
OK
127.0.0.1:6379> hmset student:xie age 22 hobby basketball score 93
OK
127.0.0.1:6379> hmset student:qin age 21 hobby tennis score 88
OK
127.0.0.1:6379> sort students by student:*->age
1) "su"
2) "qin"
3) "xie"
127.0.0.1:6379> sort students by student:*->hobby alpha
1) "xie"
2) "su"
3) "qin"
[GET pattern [GET pattern ...]]
这个命令对students进行排序,可以返回其他属性,而不仅仅只是返回名字,返回名字使用get #(get #获取自己的属性),返回字段顺序与get pattern的顺序一致。
127.0.0.1:6379> sort students by student:*->age get student:*->hobby alpha
1) "football"
2) "tennis"
3) "basketball"
127.0.0.1:6379> sort students by student:*->age get student:*->hobby alpha get student:*->score
1) "football"
2) "85"
3) "tennis"
4) "88"
5) "basketball"
6) "93"
127.0.0.1:6379> sort students by student:*->age get # get student:*->hobby alpha get student:*->score
1) "su"
2) "football"
3) "85"
4) "qin"
5) "tennis"
6) "88"
7) "xie"
8) "basketball"
9) "93"
[LIMIT offset count]
offset:要跳过的元素数量;count:要返回的元素个数
127.0.0.1:6379> sort students by student:*->age get # get student:*->hobby alpha get student:*->score limit 0 1
1) "su"
2) "football"
3) "85"
127.0.0.1:6379> sort students by student:*->age get # get student:*->hobby alpha get student:*->score limit 1 2
1) "qin"
2) "tennis"
3) "88"
4) "xie"
5) "basketball"
6) "93"
[STORE destination]
将排序结果保存到列表键(destination)中
127.0.0.1:6379> sort students by student:*->age get # get student:*->hobby alpha get student:*->score limit 1 2 store des
(integer) 6
127.0.0.1:6379> lrange des 0 -1
1) "qin"
2) "tennis"
3) "88"
4) "xie"
5) "basketball"
6) "93"
sort命令增加以上限制条件的顺序,除了[GET pattern [GET pattern ...]] 会影响结果,其他都不会影响最终的返回结果。
如果有写的不对的地方,请大家多多批评指正,非常感谢!