Redis中的排序

    xiaoxiao2022-07-05  213

    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只能有一个参数,关系型数据库中能有多个参数,下面举个例子:

    studentsidnameagehobbyscore1su20football852xie22basketball 933qin21tennis88 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 ...]] 会影响结果,其他都不会影响最终的返回结果。

     

     

    如果有写的不对的地方,请大家多多批评指正,非常感谢!

    最新回复(0)