首頁 > 軟體

Redis排序命令Sort深入解析

2022-12-11 14:01:14

引言

Redis是一款快速、優秀的鍵值對資料庫,提供豐富的資料結構能在各種場景下實現功能,同時也提供豐富的命令來完成各種各樣的功能,本篇文章將深入淺出的解析Sort命令的原理以及使用

原理

Sort 命令用來對list、set、zset物件進行排序,返回排序後的結果

Sort命令會使用一個與原來物件等長的陣列,陣列中的節點RedisSortObject儲存了元素(指向對應元素)以及權值,排序就是根據權值來排序,權值預設情況下是浮點型,如果要排序的是字串則權值為字串物件

等長陣列中的RedisSortObject節點會與排序物件中的元素一一對應記錄元素物件的地址和權值

再使用快速排序根據等長陣列中RedisSortObject物件中的權值進行排序(預設升序)

注意:排序只在新陣列中操作,並沒有改變原來的物件

圖中排序流程對應以下命令操作

 127.0.0.1:6379> lpush number 1 3 5
 (integer) 3
 127.0.0.1:6379> lrange number 0 -1
 1) "5"
 2) "3"
 3) "1"
 127.0.0.1:6379> sort number
 1) "1"
 2) "3"
 3) "5"

alpha 選項

alpha選項對字串進行排序,如果對字串進行排序不使用alpha會報出字串無法轉換為浮點型(預設浮點型)的異常

使用alpha選項則是對字串進行排序

 127.0.0.1:6379> sadd set z x c n r a
 (integer) 6
 127.0.0.1:6379> smembers set
 1) "x"
 2) "n"
 3) "a"
 4) "r"
 5) "z"
 6) "c"
 127.0.0.1:6379> sort set alpha
 1) "a"
 2) "c"
 3) "n"
 4) "r"
 5) "x"
 6) "z"

by 選項

如果希望不是根據當前集合的元素進行排序,而是根據其他Key來排序則使用 by 選項

by *-value表示獲取當前元素的key代替*-value拼接得到新的Key,查詢新Key得到的值拿來排序

這種情況下RedisSortObject中記錄的權值為新Key的值

比如當前元素是cc 則新key為 cc-value ,查詢到新key值為88 因此排中間

如果新key結果為字串 則要使用alpha 選項

 127.0.0.1:6379> sadd set tom cc jack
 (integer) 3
 127.0.0.1:6379> mset tom-value 99 cc-value 88 jack-value 77
 OK
 127.0.0.1:6379> smembers set
 1) "cc"
 2) "jack"
 3) "tom"
 127.0.0.1:6379> sort set by *-value
 1) "jack"
 2) "cc"
 3) "tom"
 #使用新key的值為字串時使用alpha
 127.0.0.1:6379> mset tom-str a cc-str b jack-str c
 OK
 127.0.0.1:6379> sort set alpha by *-str
 1) "tom"
 2) "cc"
 3) "jack"

limit 選項

limit用來限制返回的數量,使用方式類比MySQL的limit

 127.0.0.1:6379> sort set alpha by *-str
 1) "tom"
 2) "cc"
 3) "jack"
 127.0.0.1:6379> sort set alpha by *-str limit 0 2
 1) "tom"
 2) "cc"
 127.0.0.1:6379> sort set alpha by *-str limit 1 2
 1) "cc"
 2) "jack"

get 選項

與by類似,但是by作用的是排序值,而get作用的是返回值

如果希望返回值不是當前元素的值,而是其他key的返回值,則使用get

get *-res表示獲取當前元素的key代替*-res拼接得到新的Key,查詢新Key得到的值用於返回結果

比如當前元素是cc 則新key為 cc-res ,查詢到新key值為cc-result 因此響應時返回cc-result

 127.0.0.1:6379> sort set alpha by *-str limit 0 3
 1) "tom"
 2) "cc"
 3) "jack"
 127.0.0.1:6379> mset tom-res tom-result cc-res cc-result jack-res jack-result
 OK
 127.0.0.1:6379> sort set alpha by *-str limit 0 3 get *-res
 1) "tom-result"
 2) "cc-result"
 3) "jack-result"

store 選項

sort不是對原本的物件在原地進行排序,而是使用新陣列來儲存排序結果

使用store選項能將排序結果,使用list命令來生成Key,key為list型別

 127.0.0.1:6379> sort set alpha by *-str limit 0 3 get *-res
 1) "tom-result"
 2) "cc-result"
 3) "jack-result"
 127.0.0.1:6379> sort set alpha by *-str limit 0 3 get *-res store setresult
 (integer) 3
 127.0.0.1:6379> type setresult
 list
 127.0.0.1:6379> lrange setresult 0 -1
 1) "tom-result"
 2) "cc-result"
 3) "jack-result"

總結

本篇文章圍繞Sort命令,深入淺出的解析Sort命令原理以及使用

Sort命令使用新的等長陣列來對list、set、zset物件進行排序,其中陣列中的節點RedisSortObject儲存元素地址和權值,先使用節點記錄要排序物件中元素的地址和權值,再使用快速排序根據權值進行排序然後返回

預設情況下權值為浮點型,如果是對字串型別排序,需要使用alpha選項;

想要使用其他key作為權值排序時使用by選項;

限制結果集返回使用limit;

想要返回其他key的值時使用get選項;

想儲存結果並生成列表物件時使用store

參考資料

以上就是Redis排序命令Sort深入解析的詳細內容,更多關於Redis Sort排序命令的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com