Redis入門 4 排序

2021-10-06 16:05:14 字數 1932 閱讀 7223

很多場合需要對元素進行排序,這時除了使用有序集合外,還可以借助redis提供的sort命令來排序。

sort命令可以對列表型別、集合型別和有序集合型別的鍵進行排序。

sort key

sort key desc

sort key alpha

sort命令會根據元素自身的值進行排序,在對有序集合型別排序時會忽略元素的分數。

預設按從小到大的順序排列,增加desc引數可以按照倒序排列。

如果元素為非數字,增加alpha引數可以按照字典順序排列。如果直接對非數字元素排序會報錯:

(error)err one or more scores can't be converted into double
如果沒有加alpha引數的話,sort命令會嘗試將所有元素轉換成雙精度浮點數來比較,如果無法轉換則會提示錯誤。

如果返回結果數量較多需要分頁,可以使用limit引數

sort key desc limit offset count
表示在排序結果中,跳過前offset個元素,獲取之後的count個元素。

很多情況下列表(或集合、有序集合)中儲存的元素值代表的是物件的id,單純對這些id自身排序有時意義並不大。更多的時候會希望根據id對應的物件的某個屬性進行排序。

這種情況下可以使用by引數:

sort key by reference
sort tag:ruby:posts by post:* -> time desc
這裡tag:ruby:posts儲存了文章的id,post:*為雜湊型別,其中的time欄位為文章的發布時間,這樣就可以將文章id根據發布時間排序了。執行的時候,對每個元素使用元素的值替換參考鍵中的第乙個「*」並獲取其值,然後依據該值對元素排序。

上面是基於雜湊型別排序的寫法,基於字串排序更簡單:

sort sortbylist by itemscore:* -> time desc
by引數排序有下面幾種特殊情況:

sort命令預設返回的是鍵本身的元素被排序後的結果,而使用get引數可以指定返回鍵值。

比如前面按照文章發布時間排序後,並不僅僅獲得文章id,而是更進一步獲取文章的標題,可以這樣寫:

sort tag:ruby:posts by post:* -> time desc get post:*->title
而且,在乙個sort命令中可以使用多個get引數(by引數只能有乙個):

sort tag:ruby:posts by post:* -> time desc get post:*-> title get post:* -> time
sort tag:ruby:posts by post:* -> time desc get post:*-> title get post:* -> time get #
這樣最終的結果就包含了文章的標題、發布時間和id。

預設情況下sort會直接返回排序結果,如果希望儲存排序結果,可以使用store引數,比如要把排序的結果儲存到sort.result鍵中:

sort tag:ruby:posts by post:* -> time desc store sort.result
儲存後的鍵的型別為列表型別,如果鍵已經存在則會覆蓋它。加上store引數後sort命令的返回值為結果的個數。

實際使用中,常常將store命令與之前學過的expire結合,來快取排序的結果。

sort是redis中最強大最複雜的命令之一,但如果使用不好也很容易成為效能的瓶頸。

sort命令的時間複雜度是o(n+mlog m),其中:

所以在使用sort命令時要注意這幾點:

09 排序1 排序

09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...

09 排序1 排序

n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。資料2 11個不相同的整數,測試基本正確性 資料3 10 3個隨機整數 資料4 10 4個隨機整數 資料5 10 5個隨機整數 資料6 10 5個順序整數 資料7 10 5個逆序整數 資料8 10 5個基本有序的整數 資料9 10 5個隨機正...

09 排序1 排序

本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 只有1個元素 資料2 11個不相同的整數,測試基本正確性 資料3 103個隨機整數 資料4 104個隨機整數 資料5 105個隨機整數 資料6 105個順序整數 資料7 105個逆序整數 資料8 105個基本有序的...