Redis进阶-排序SORT

目录

▪️ 基本命令介绍:

▪️ 初步了解:

▪️ 列表、无序集合、有序集合排序  SORT:  

▪️ 倒序 DESC参数

▪️ LIMIT 参数

▪️ 按参考键排序 BY参数

▪️ GET参数

▪️ 将排序结果保存在key中 STORE参数


▪️ 基本命令介绍:

           https://blog.csdn.net/qq_42816268/article/details/115178561

▪️ 初步了解:

                   1)SORT命令的时间复杂度是O(n+m*log(m)),n:要排序的元素个数 ,m:要返回的元素个数,当n比较大时,性能消耗会比较大

                   2)redis在进行执行SORT命令时,先会创建一个长度为n的临时存储容器,所以当执行的排序操作过多时,临时存储容器也会多,性能也会消耗较大

                   3)n尽可能的小、m也尽可能的小只取自己需要的数据,如果排序的n比较大时,建议用后面提到的STORE参数将结果保存起来,有需要的话在此基础上再建立一个expire过期时间,这样可以保证一定的实时性,和减少性能的消耗

▪️ 列表、无序集合、有序集合排序  SORT:  

              1)语法:SORT key 

              2)语意:对指定key的列表、无序集合、有序集合(仅对元素,忽略分数) 进行排序

              3)要点:对有序集合进行排序时,是对其元素进行比较,分数是忽略的

127.0.0.1:6379> SORT sortList   // 对列表进行排序:sortList = [1,3,7,5,2,4] 排序后:[1,2,3,4,5,7]
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
127.0.0.1:6379> SORT sortSet // 对列表进行排序:sortSet = (1,3,7,5,2,4) 排序后:(1,2,3,4,5,7)
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
127.0.0.1:6379> ZADD sortZet 40 1 50 3 60 2 80 4 25 5 27 7 // 生成有序集合(1:40, 3:50, 2:60, 4:80, 5:25, 7:27)
(integer) 6
127.0.0.1:6379> SORT sortZet //对有序集合进行排序:(1:40, 2:60, 3:50, 4:80, 5:25, 7:27)
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"

▪️ 倒序 DESC参数

              1)语法:SORT key  DESC

              2)语意:对指定key的列表、无序集合、有序集合(仅对元素,忽略分数) 按倒序进行排序

127.0.0.1:6379> SORT sortList DESC // 对列表进行排序:sortList = [1,3,7,5,2,4] 排序后:[7,5,4,3,2,1]
1) "7"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"

▪️ LIMIT 参数

              1)语法:SORT key  LIMIT offset count

              2)语意:排序后跳过前offset个元素,取之后的count个元素              

127.0.0.1:6379> SORT sortList     // 排序后 = [1,2,3,4,5,7]
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
127.0.0.1:6379> SORT sortList LIMIT 3 2 // 排序后跳过前3个,并且取之后的2个元素 4,5
1) "4"
2) "5"

 

▪️ 按参考键排序 BY参数

              1)语法:SORT key  BY strkey:*  、SORT key  BY hashkey:*  field (*为占位符)

              2)语意:将元素按占位符规则匹配对应的参考key,然后按参考key的value进行排序,最后结果显示原来元素的值

              3)要点:

                         1、参考key可以是字符串类型的key。userage:* 可以表示userage:1  userage:1,(13,14是需要排序的元素 sortList = [1,2,3,4,5],以每个参考key下的value进行排序,排序后显示对应的原来元素的值)。

                         2、参考key也可以是散列表类型,需要指定字段。userinf:* -> height, 可以表示为userinf:1 -> height(1是sortList中的元素,表示key为userinf:1,指定字段为该散列表下的height字段,以每个参考key下height的value进行排序,排序后显示对应的原来元素的值)。

                         3、如果参考key中没有占位符,则不会进行排序,并且如果参考key为散列表类型时,占位符*只能存在于key中,不能存在于field中,如果只存在于field中,虽然redis也会进行排序,但是是按原来的元素大小进行排序,BY参数就没有意义了。

                         4、当某些元素不存在参考key时,会将其元素自身的值充当参考key的值,与其他元素进行比较。

127.0.0.1:6379> LPUSH sortByList 1 3 2 5 4   // sortByList = [1,3,2,5,4]
(integer) 5
127.0.0.1:6379> SET userage:3 13             //以下key的组成格式为 userage:* 
OK
127.0.0.1:6379> SET userage:1 15
OK
127.0.0.1:6379> SET userage:2 19
OK
127.0.0.1:6379> SET userage:4 20
OK
127.0.0.1:6379> SET userage:5 16
OK
127.0.0.1:6379> SORT sortByList              // 正常按正序排序 : [1,2,3,4,5]
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SORT sortByList BY userage:* // 按参考key排序,排序规则是将sortByList按userage:*对应的value来排
1) "3"
2) "1"
3) "5"
4) "2"
5) "4"


// 散列表为参考key
127.0.0.1:6379> HSET userinf:1 height 180 weight 150 // 以下散列表key的组成方式:userinf:* ,指定字段为height
(integer) 2
127.0.0.1:6379> HSET userinf:2 height 178 weight 150 
(integer) 2
127.0.0.1:6379> HSET userinf:3 height 188 weight 150
(integer) 2
127.0.0.1:6379> HSET userinf:4 height 179 weight 150
(integer) 2
127.0.0.1:6379> HSET userinf:5 height 190 weight 150
(integer) 2
127.0.0.1:6379> SORT sortList BY userinf:*->height   // 按参考key指定的height字段的value来排序
1) "2"
2) "4"
3) "1"
4) "3"
5) "5"

// 当参考key中不存在*时,或者参考key不存在时,则不会进行排序
127.0.0.1:6379> LRANGE sortList 0 -1      
1) "4"
2) "5"
3) "7"
4) "2"
5) "3"
6) "1"
127.0.0.1:6379> SORT sortList BY aaa   // 参考key aaa不存在,所以不会进行排序
1) "4"
2) "5"
3) "7"
4) "2"
5) "3"
6) "1"

// 当某些元素不存在参考key时,会将其元素自身的值充当参考key的值,与其他元素进行比较
127.0.0.1:6379> lrange sortList 0 -1   // sortList = [4,5,7,2,3,1]
1) "4"
2) "5"
3) "7"
4) "2"
5) "3"
6) "1"
127.0.0.1:6379> SET userWeight:1 150   //  以下参考key的组成方式:userWeight:sortList[i] i的取值范围:[0,len(sortList) - 1]
OK
127.0.0.1:6379> SET userWeight:2 140
OK
127.0.0.1:6379> SET userWeight:5 160
OK
127.0.0.1:6379> SORT sortList BY userWeight:* // 可以发现sortList的元素中,3 4 7是没有参考key的,所以排序的时候会将他们自己元素的值的大小充当参考key的值,然后再与其他拥有参考key的元素进行比较
1) "3"
2) "4"
3) "7"
4) "2"
5) "1"
6) "5"


// 当参考key对应的value相等的情况:先按参考key对应的value排序,在遇到value相等的情况时,再将其元素本身的值进行排序,所以是先找到最小值140,然后找到150,发现有多个150,此时按元素自身排,150排完之后去排160
127.0.0.1:6379> SET userWeight:1 150
OK
127.0.0.1:6379> SET userWeight:2 140
OK
127.0.0.1:6379> SET userWeight:3 150
OK
127.0.0.1:6379> SET userWeight:4 160
OK
127.0.0.1:6379> SET userWeight:5 160
OK
127.0.0.1:6379> SET userWeight:7 150
OK
127.0.0.1:6379> SORT sortList BY userWeight:*
1) "2"
2) "1"
3) "3"
4) "7"
5) "4"
6) "5"

▪️ GET参数

              1)语法:SORT key  GET strkey:* 、SORT key GET hashkey:*   field

              2)语意:排序后获取每一个元素参考key的value

              3)要点:

                      1、参考key可以是字符串类型

                      2、参考key也可以是散列表类型, 需要指定field(散列表类型*占位符只能存在与key中,不能存在与field中) 

                      3、GET参数可以于BY参数连用

                      4、若你想获取多个参考key的value,GET可以连用 SORT key  GET strkey1:* GET strkey2:* 

                      5、如果你还想获取*本身 ,再加一个GET #就可以了

127.0.0.1:6379> LRANGE sortList 0 -1   // sortList = [4,5,7,2,3,1]
1) "4" 
2) "5"
3) "7"
4) "2"
5) "3"
6) "1"
127.0.0.1:6379> SET userName:1 Tom1    // 以下字符串类型参考key的结构:userName:* ,*代表排序后每个元素的值的占位符
OK
127.0.0.1:6379> SET userName:3 Tom2  
OK
127.0.0.1:6379> SET userName:4 Tom4
OK
127.0.0.1:6379> SET userName:5 Tom5
OK
127.0.0.1:6379> SET userName:7 Tom7
OK
127.0.0.1:6379> SORT sortList GET userName:* //先将sortList排序,然后将排序后的每一个元素匹配字符串类型键userName:*的value,如果userName:*不存在,则该元素的位置返回空
1) "Tom1"
2) (nil)
3) "Tom2"
4) "Tom4"
5) "Tom5"
6) "Tom7"

▪️ 将排序结果保存在key中 STORE参数

              1)语法:SORT key  STORE key2

              2)语意:排序后将结果保存在key2中

              3)要点:如果key2已经存在,则会将其覆盖

127.0.0.1:6379> SORT sortList DESC    // sortList = [1,2,3,4,5,7]
1) "7"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> SORT sortList STORE sortList2 // 将结果保存在sortList2中
(integer) 6
127.0.0.1:6379> LRANGE sortList2 0 -1         // sortList2 = [1,2,3,4,5,7]
1) "7"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值