让技能成为潜意识之Redis技能 SORT排序命令使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zf1315/article/details/72356706

Sort排序命令    

抛图引意

      SORT的命令格式前几天有一个同事给我发了一个图,问我图中问题代表的意思,先上个图吧:

       

命令格式

       SORT的命令格式: SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]

      默认情况下,SORT是基于数字进行正序排序,元素会被转化成双精度浮点数进行大小比对排序。如果元素中包含字符串,可以使用ALPHA进行字典顺序排列。同时对于返回的元素使用LIMIT描述符进行限制。 

127.0.0.1:6379> sadd item-list 2
(integer) 1
127.0.0.1:6379> sadd item-list 1
(integer) 1
127.0.0.1:6379> sadd item-list 4
(integer) 1
127.0.0.1:6379> sadd item-list 3
(integer) 1
127.0.0.1:6379> sort item-list
1) "1"
2) "2"
3) "3"
4) "4"

外部KEY排序

Redis Sort命令可以添加BY参数,一条语句只能有一个BY参数。通过BY可以使用外部的key来作为权重对列表或集合进行排序。这时SORT不会根据自身的值进行排序,以实例来说话。

127.0.0.1:6379> hset article:1 title '这是一个标题'
(integer) 1
127.0.0.1:6379> hset article:1 tag 'test'
(integer) 1
127.0.0.1:6379> hset article:1 download 20
(integer) 1
127.0.0.1:6379> hset article:1 id 1
(integer) 1
127.0.0.1:6379> hgetall article:1
1) "title"
2) "\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe6\xa0\x87\xe9\xa2\x98"
3) "tag"
4) "test"
5) "download"
6) "20"
7) "id"
8) "1"
127.0.0.1:6379> hset article:2 title '这是另一个标题'
(integer) 1
127.0.0.1:6379> hset article:2 tag 'test'
(integer) 1
127.0.0.1:6379> hset article:2 download 15
(integer) 1
127.0.0.1:6379> hset article:2 id 2
(integer) 1
127.0.0.1:6379> hset article:3 title '学习REDIS'
(integer) 1
127.0.0.1:6379> hset article:3 tag 'test'
(integer) 1
127.0.0.1:6379> hset article:3 download 30
(integer) 1
127.0.0.1:6379> hset article:3 id 3
(integer) 1

       通过BY描述符可以按照外部的key进行排序。例如,我想要按文章的下载量对item-list进行排序。

127.0.0.1:6379> sort item-list by article:*->download desc
1) "3"
2) "1"
3) "2"
4) "4"
      解释:article:*中的*是一个占位符,先把item-list中的值取出,代入*中,再去查找article:*中的元素download的值。在这里,article:*中的*会分别被1,2,3代替,然后得到article:1,article:2,article:3列表,根据列表的下载量(download)对item-list来排序。这样,最初发的图前半部分所要代表的意思也就可以解释出了。

不进行排序

     Redis SORT命令还有个GET参数,GET参数类似在关系型数据库中的关联查询。GET可以有多个。如果要按散列表article的下载量倒序排序,然后取到article中每个元素的下载量,取到article元素的标题和编号(id),可以如下操作:

127.0.0.1:6379> sort item-list by article:*->download desc get article:*->download get article:*->title get #
 1) "30"
 2) "\xe5\xad\xa6\xe4\xb9\xa0REDIS"
 3) "3"
 4) "20"
 5) "\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe6\xa0\x87\xe9\xa2\x98"
 6) "1"
 7) "15"
 8) "\xe8\xbf\x99\xe6\x98\xaf\xe5\x8f\xa6\xe4\xb8\x80\xe4\xb8\xaa\xe6\xa0\x87\xe9\xa2\x98"
 9) "2"
10) (nil)
11) (nil)
12) "4"

注:GET #的意思是用来获取到被排序的key的值,可以写GET article:*->id,也可以写GET #。通过GET能够一次取得多个key的值。

STORE存储

       默认情况下,排序结果是返回到客户端。使用STORE命令可以将排序后的内容存储到一个新的key中。新key中的类型是列表类型,如果存在则会覆盖。用法如下:

127.0.0.1:6379> sort item-list by article:*->download desc get article:*->download store result_key
(integer) 4
127.0.0.1:6379> lrange result_key 0 -1
1) "30"
2) "20"
3) "15"
4) ""

返回值

      如果没有使用STORE描述符,返回列表形式的排序结果。如果使用STORE参数,返回排序结果的元素数量。

     补充:REDIS的SORT命令是REDIS最复杂强大的命令之一,时间复杂度是O(n+mLOGm)。其中n是待排序的列表长度,m是返回的元素个数。减少n和m会提高SORT的性能。


展开阅读全文

没有更多推荐了,返回首页