Redis学习笔记(九) 排序SORT及参数详解

Redis学习笔记(九) 排序SORT及参数详解

1.排序SORT

SORT命令可以对列表类型集合类型有序集合类型键进行排序,并且可以完成与关系数据库中的连接查询相类似的任务。

  • SORT
    • 返回或存储key的list、 set 或sorted set 中的元素。默认是按照数值类型排序的,并且按照两个元素的双精度浮点数类型值进行比较。
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]

2. SORT参数

  • [ASC | DESC] 参数:ASC是从小到大,与默认相同。DESC是从大到小排序。
127.0.0.1:6379> LPUSH testSort 1 -2 9 3 5 
(integer) 5
127.0.0.1:6379> SORT testSort 
1) "-2"
2) "1"
3) "3"
4) "5"
5) "9"
127.0.0.1:6379> SORT testSort ASC
1) "-2"
2) "1"
3) "3"
4) "5"
5) "9"
127.0.0.1:6379> SORT testSort DESC
1) "9"
2) "5"
3) "3"
4) "1"
5) "-2"
  • [ALPHA] 参数:是指定按字母ASCII码大小排序。
127.0.0.1:6379> LPUSH testSort2 hello world bye test sort home
(integer) 6
127.0.0.1:6379> SORT testSort2
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> SORT testSort2 ALPHA
1) "bye"
2) "hello"
3) "home"
4) "sort"
5) "test"
6) "world"
127.0.0.1:6379> SORT testSort2 ALPHA DESC
1) "world"
2) "test"
3) "sort"
4) "home"
5) "hello"
6) "bye"

[LIMIT offset count]参数 :offset偏移量,count是数目

127.0.0.1:6379> SORT testSort LIMIT 0 3 
1) "-2"
2) "1"
3) "3"
127.0.0.1:6379> SORT testSort LIMIT 0 1 DESC
1) "9"
  • [BY pattern]参数:语法为BY + 参考键,其中参考键可以是字符串类型键或者是散列类型键的某个字段。

如果提供了BY参数,SORT命令将不在依据元素自身的值进行排序,而是==对每个元素使用元素的值替换参考键中第一个 “*” 并获取其值==,然后对该值进行元素排序。

使用字符串类型键作为参考键:

127.0.0.1:6379> LPUSH user 1
(integer) 1
127.0.0.1:6379> SET weight1 80
OK
127.0.0.1:6379> LPUSH user 2
(integer) 2
127.0.0.1:6379> SET weight2 88
OK
127.0.0.1:6379> LPUSH user 3
(integer) 3
127.0.0.1:6379> SET weight3 77
OK
127.0.0.1:6379> LPUSH user 4
(integer) 4
127.0.0.1:6379> SET weight4 79
OK
127.0.0.1:6379> SORT user
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SORT user BY weight*
1) "3"
2) "4"
3) "1"
4) "2"
  • [GET pattern]参数:语法为GET + 参考键,GET参数不影响排序,它的作用是使SORT命令返回的结果不再是元素自身,而是GET参数中指定的值。

GET参数也支持字符串类型键和散列类型键,并使用 “ * ” 作为占位符。

一个SORT命令中可以有很多个GET参数,而BY参数只能有一个。

GET # 可以返回元素本身

使用散列类型作为参考键:

127.0.0.1:6379> HSET user_hash1 name admin
(integer) 1
127.0.0.1:6379> HSET user_hash2 name jack
(integer) 1
127.0.0.1:6379> HSET user_hash3 name rock
(integer) 1
127.0.0.1:6379> HSET user_hash4 name test
(integer) 1

127.0.0.1:6379> SORT user GET user_hash*->name
1) "admin"
2) "jack"
3) "rock"
4) "test"
127.0.0.1:6379> SORT user BY weight* GET user_hash*->name
1) "rock"
2) "test"
3) "admin"
4) "jack"
127.0.0.1:6379>  SORT user GET # GET user_hash*->name GET weight*
 1) "1"
 2) "admin"
 3) "80"
 4) "2"
 5) "jack"
 6) "88"
 7) "3"
 8) "rock"
 9) "77"
10) "4"
11) "test"
12) "79"
  • [STORE destination]参数:默认情况下SORT会直接返回排序结果,如果希望保存排序结果,可以使用STORE参数。
127.0.0.1:6379> SORT testSort 
1) "-2"
2) "1"
3) "3"
4) "5"
5) "9"
127.0.0.1:6379> SORT testSort STORE testRes
(integer) 5
127.0.0.1:6379> LRANGE testRes 0 -1
1) "-2"
2) "1"
3) "3"
4) "5"
5) "9"

3. SORT性能优化

SORT命令的时间复杂度为O(n+mlogm),n表示排序的列表(集合或有序集合)中元素的个数,m表示返回的元素个数。当n比较大时SORT命令的性能相对比较低,并且在排序前会建立一个长度为n的容器(有序集合容器大小为m)来存储待排序的元素。

使用SORT命令的注意事项:

  • 尽可能减少待排序键中的元素的数量(减小n)
  • 使用LIMIT参数值获取需要的数据(减小m)
  • 如果要排序的数据量较大,尽可能使用STORE参数将结果缓存。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值