日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis学习日记-05:SORT命令

發布時間:2023/12/10 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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命令時應該注意以下幾點:

  • 盡可能減少待排序鍵中的元素;
  • 盡可能減少排序之后返回的數據,你可以使用上面提到的LIMIT選項來控制;
  • 如果排序返回的結果較多,盡可能使用上面提到的STORE將排序結果緩存起來。
  • 轉載于:https://www.cnblogs.com/xuxiaojian/p/9559989.html

    總結

    以上是生活随笔為你收集整理的Redis学习日记-05:SORT命令的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。