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

来源:互联网 发布:惠州人民政府网络问政 编辑:程序博客网 时间:2024/06/06 09:33

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) 1127.0.0.1:6379> sadd item-list 1(integer) 1127.0.0.1:6379> sadd item-list 4(integer) 1127.0.0.1:6379> sadd item-list 3(integer) 1127.0.0.1:6379> sort item-list1) "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) 1127.0.0.1:6379> hset article:1 tag 'test'(integer) 1127.0.0.1:6379> hset article:1 download 20(integer) 1127.0.0.1:6379> hset article:1 id 1(integer) 1127.0.0.1:6379> hgetall article:11) "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) 1127.0.0.1:6379> hset article:2 tag 'test'(integer) 1127.0.0.1:6379> hset article:2 download 15(integer) 1127.0.0.1:6379> hset article:2 id 2(integer) 1127.0.0.1:6379> hset article:3 title '学习REDIS'(integer) 1127.0.0.1:6379> hset article:3 tag 'test'(integer) 1127.0.0.1:6379> hset article:3 download 30(integer) 1127.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 desc1) "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) 4127.0.0.1:6379> lrange result_key 0 -11) "30"2) "20"3) "15"4) ""

返回值

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

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