Redis入門(4) - 排序

  • SORT命令
  • LIMIT參數
  • BY參數
  • GET參數
  • STORE參數
  • 排序性能優化

不少場合須要對元素進行排序,這時除了使用有序集合外,還能夠藉助Redis提供的SORT命令來排序。緩存

SORT命令

SORT命令能夠對列表類型、集合類型和有序集合類型的鍵進行排序。ruby

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命令會嘗試將全部元素轉換成雙精度浮點數來比較,若是沒法轉換則會提示錯誤。post

LIMIT參數

若是返回結果數量較多須要分頁,可使用LIMIT參數性能

SORT key DESC LIMIT offset count

表示在排序結果中,跳過前offset個元素,獲取以後的count個元素。大數據

BY參數

不少狀況下列表(或集合、有序集合)中存儲的元素值表明的是對象的ID,單純對這些ID自身排序有時意義並不大。更多的時候會但願根據ID對應的對象的某個屬性進行排序。
這種狀況下可使用BY參數:優化

SORT key BY reference

其中reference表示排序的參考鍵,會根據參考鍵的值來排序,而再也不是列表或集合中元素自身的值。
好比:code

SORT tag:ruby:posts BY post:* -> time DESC

這裏tag:ruby:posts存儲了文章的ID,post:*爲散列類型,其中的time字段爲文章的發佈時間,這樣就能夠將文章ID根據發佈時間排序了。執行的時候,對每一個元素使用元素的值替換參考鍵中的第一個「*」並獲取其值,而後依據該值對元素排序。對象

上面是基於散列類型排序的寫法,基於字符串排序更簡單:排序

SORT sortbylist BY itemscore:* -> time DESC

BY參數排序有下面幾種特殊狀況:

  • 當參考鍵名不包含「*」時(即常量鍵名,與元素值無關),SORT命令將不會執行排序操做,由於Redis認爲這種狀況是沒有意義的(全部要比較的值都同樣)。
  • 若是幾個元素的參考鍵值相同,則SORT命令會再比較元素自己的值來決定元素的順序。
  • 當某個元素的參考鍵不存在時,會默認參考鍵的值爲0。

GET參數

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

若是仍然須要文章的ID,可使用GET #:

SORT tag:ruby:posts BY post:* -> time DESC GET post:*-> title GET post:* -> time GET #

這樣最終的結果就包含了文章的標題、發佈時間和ID。

STORE參數

默認狀況下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),其中:

  • n表示要排序的列表(集合或有序集合)中的元素個數
  • m表示要返回的元素個數
    當n較大的時候SORT命令的性能相對較低,而且Redis在排序前會創建一個長度爲n的容器來存儲待排序的元素,雖然是一個臨時的過程,但若是同時進行較多的大數據量排序操做則會嚴重影響性能。

因此在使用SORT命令時要注意這幾點:

  • 減少n,儘可能減小待排序鍵中元素的數量;
  • 減小m,使用LIMIT參數只獲取須要的數據;
  • 若是排序的數據量較大,常常須要排序,可使用STORE和EXPIRE將結果緩存起來。
相關文章
相關標籤/搜索