您的位置:首页 > 数据库 > Redis

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

2017-03-15 17:50 381 查看

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参数将结果缓存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis 数据库 存储 class