Redis学习日记-05:SORT命令
目錄
- 前言
- 命令&選項
- SORT(默認根據元素由小到大):
- DESC(逆序):
- ALPHA(非數字元素排序):
- BY(參考鍵):
- LIMIT(返回指定范圍的結果):
- GET(指定排序之后的返回數據):
- STORE(將排序結果存入另一個鍵中)
- 總結
前言
在進行數據排序的時候很容易想到使用ZSET(有序集合)。然而有序集合常見的使用場景是大數據排序,如游戲玩家排行榜等,所以很少獲取鍵中的全部數據。然而在Redis中對數據的排序除了用有序集合外還可以使用SORT命令。
SORT命令可以對列表、集合、有序集合類型的鍵進行排序。
命令&選項
以列表類型為例:
127.0.0.1:6379> lrange post 0 -1 1) "2" 2) "1" 3) "3"SORT(默認根據元素由小到大):
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(非數字元素排序):
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選項后面的參數“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的結果和LRANGE的結果相同,沒有執行排序操作。常量鍵指的是不包含“*”,如“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(返回指定范圍的結果):
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選項后面可以跟兩個參數,一個是offset,代表從那個位置開始;另一個是count,代表取多少個元素。和Mysql的LIMIT語法很像。
GET(指定排序之后的返回數據):
示例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(將排序結果存入另一個鍵中)
針對上面GET命令示例2中的數據,再附加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選項后面跟了一個參數鍵sort:result,這個鍵可以是之前不存在的,命令執行后,會將排序返回的結果存放到該鍵中以列表的形式存在。
總結
??SORT是Redis最強大的命令之一,如果使用不當會造成性能瓶頸。SORT的時間復雜度為O(n+mlog(m)),其中n表示待排序元素的數量,m表示返回的元素數量。當n很大時,Redis在排序前建立一個長度為n的容器來存儲待排序元素,因此同時進行大數據量的排序不管是在時間還是空間上消耗很多,從而降低性能。
??因此使用SORT命令時應該注意以下幾點:
轉載于:https://www.cnblogs.com/xuxiaojian/p/9559989.html
總結
以上是生活随笔為你收集整理的Redis学习日记-05:SORT命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 查询Word是否存在关键字,并
- 下一篇: mysql 随机选取一条记录