Redis中的排序

Redis的sort命令可用于list、set、zset等数据类型的排序,支持多种参数如[ASC|DESC]、[ALPHA]、[BY pattern]、[GET pattern]、[LIMIT offset count]和[STORE destination]。通过示例介绍了如何根据需求进行排序和获取额外属性,并强调了不同参数对结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
idnameagehobbyscore
1su20football85
2xie22basketball 93
3qin21tennis88
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 ...]] 会影响结果,其他都不会影响最终的返回结果。

 

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值