Redis学习日记-05:SORT命令
目錄
- 前言
- 命令&選項- SORT(默認根據(jù)元素由小到大):
- DESC(逆序):
- ALPHA(非數(shù)字元素排序):
- BY(參考鍵):
- LIMIT(返回指定范圍的結(jié)果):
- GET(指定排序之后的返回數(shù)據(jù)):
- STORE(將排序結(jié)果存入另一個鍵中)
 
- 總結(jié)
前言
在進行數(shù)據(jù)排序的時候很容易想到使用ZSET(有序集合)。然而有序集合常見的使用場景是大數(shù)據(jù)排序,如游戲玩家排行榜等,所以很少獲取鍵中的全部數(shù)據(jù)。然而在Redis中對數(shù)據(jù)的排序除了用有序集合外還可以使用SORT命令。
 SORT命令可以對列表、集合、有序集合類型的鍵進行排序。
命令&選項
以列表類型為例:
127.0.0.1:6379> lrange post 0 -1 1) "2" 2) "1" 3) "3"SORT(默認根據(jù)元素由小到大):
127.0.0.1:6379> sort post 1) "1" 2) "2" 3) "3"DESC(逆序):
127.0.0.1:6379> sort post desc 1) "3" 2) "2" 3) "1"在SORT命令后面加上DESC選項即可將元素逆序排序
ALPHA(非數(shù)字元素排序):
127.0.0.1:6379> lrange strlist 0 -1 1) "d" 2) "B" 3) "C" 4) "b" 5) "A"加上ALPHA選項(如果不加該選項會報錯:(error) ERR One or more scores can't be converted into double)
127.0.0.1:6379> sort strlist alpha 1) "A" 2) "b" 3) "B" 4) "C" 5) "d"該選項會按照字典順序排序。
BY(參考鍵):
示例1
127.0.0.1:6379> hget post:1 count "10" 127.0.0.1:6379> hget post:2 count "15" 127.0.0.1:6379> hget post:3 count "5" 127.0.0.1:6379> lrange post 0 -1 1) "2" 2) "1" 3) "3" 127.0.0.1:6379> sort post by post:*->count 1) "3" 2) "1" 3) "2"==實例2(某個參考鍵不存在的情況)==:
127.0.0.1:6379> lrange post 0 -1 1) "4" 2) "2" 3) "1" 4) "3" 127.0.0.1:6379> hget post:4 count (nil) 127.0.0.1:6379> sort post by post:*->count 1) "4" 2) "3" 3) "1" 4) "2"- 該選項可以指定一個參考鍵(該參考鍵可以是字符串類型鍵或者散列類型鍵的某個字段)來進行排序,而不按照待排序鍵的元素大小排序。
 如上所示,BY選項后面的參數(shù)“post:->count”,表示按照“post:”開頭的散列的count字段排序,過程中會用待排序鍵的元素替換“”,即先分別取到post:2、post:1、post:3的count字段的值,分別為15、10、5,并按該值由小到大排序(5,10,15)->(post:3,post:1,post:2),最后返回對應的待排序中的元素(3,1,2)。
- 如果參考鍵是一個常量鍵或者不存在的鍵,則SORT的結(jié)果和LRANGE的結(jié)果相同,沒有執(zhí)行排序操作。常量鍵指的是不包含“*”,如“post:1->count”。
- 如果參考鍵值相同,即如果上述post:1、post:2、post:3的count字段值相同,則SORT會按照待排序鍵元素本身來排序。
- 如果某個元素對應的參考鍵不存在,則默認參考鍵的值為0。如上示例2,post:4這個散列并不存在,但是post中元素中加入了4,則排序會按照由小到大(0(post:4默認),5,10,15)->(post:4,post:3,post:1,post:2),最后返回對應的待排序中的元素(4,3,1,2)。
LIMIT(返回指定范圍的結(jié)果):
127.0.0.1:6379> lrange post 0 -1 1) "4" 2) "2" 3) "1" 4) "3" 127.0.0.1:6379> sort post limit 1 3 1) "2" 2) "3" 3) "4"LIMIT選項后面可以跟兩個參數(shù),一個是offset,代表從那個位置開始;另一個是count,代表取多少個元素。和Mysql的LIMIT語法很像。
GET(指定排序之后的返回數(shù)據(jù)):
示例1
127.0.0.1:6379> sort post by post:*->count get post:*->time 1) (nil) 2) "423" 3) "123" 4) "234"實例2
127.0.0.1:6379> sort post by post:*->count get post:*->time get # 1) (nil) ---post:*->time代表的值 2) "4" ---元素本身的值 3) "423" 4) "3" 5) "123" 6) "1" 7) "234" 8) "2"- 實例1可以看到上面SORT命令后面跟了“get post:->time”,意思是該排序不返回待排序鍵元素本身,而是返回指定的以“post:”開頭的散列類型鍵的time字段。
- 你也可以使用“get #”來使其返回待排序鍵元素本身,如上示例2,依次輸出GET選項對應的值。
- SORT后面BY選項只能有一個,但是GET選項可以有多個。
STORE(將排序結(jié)果存入另一個鍵中)
針對上面GET命令示例2中的數(shù)據(jù),再附加STORE選項:
127.0.0.1:6379> sort post by post:*->count get post:*->time get # store sort:result (integer) 8 127.0.0.1:6379> type sort:result list 127.0.0.1:6379> lrange sort:result 0 -1 1) "" 2) "4" 3) "423" 4) "3" 5) "123" 6) "1" 7) "234" 8) "2"可以看到STORE選項后面跟了一個參數(shù)鍵sort:result,這個鍵可以是之前不存在的,命令執(zhí)行后,會將排序返回的結(jié)果存放到該鍵中以列表的形式存在。
總結(jié)
??SORT是Redis最強大的命令之一,如果使用不當會造成性能瓶頸。SORT的時間復雜度為O(n+mlog(m)),其中n表示待排序元素的數(shù)量,m表示返回的元素數(shù)量。當n很大時,Redis在排序前建立一個長度為n的容器來存儲待排序元素,因此同時進行大數(shù)據(jù)量的排序不管是在時間還是空間上消耗很多,從而降低性能。
 ??因此使用SORT命令時應該注意以下幾點:
轉(zhuǎn)載于:https://www.cnblogs.com/xuxiaojian/p/9559989.html
總結(jié)
以上是生活随笔為你收集整理的Redis学习日记-05:SORT命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java 查询Word是否存在关键字,并
- 下一篇: C#常用加密方式
