redis學習(六) 排序(sort,by,store,效能優化)

z1340954953發表於2018-03-04

SORT命令

sort命令可以對列表型別、集合型別和有序集合型別鍵進行排序,並且可以完成與關係型資料庫中連線查詢相類似的任務。

sort key [DESC][ALPHA]  [limit offset  count ]

1. 如果沒有加上ALPHA引數的話,sort命令會嘗試將所有元素轉為雙精度浮點數來比較,如果無法轉換則會提示錯誤。

2. DESC 命令sort預設按照從小到大的順序排列,加上desc按照從大到小的順序排列

3. limit offset count 獲取從索引offset開始的count個元素

BY引數語法

by命令搭配sort命令使用,語法是 BY  參考鍵

其中參考鍵可以是字串型別鍵或者是雜湊型別鍵的某個欄位(表示為鍵名->欄位名)。如果提供了BY引數,sort

命令將不再依據元素自身的值進行排序,而是對每個元素使用元素的值替換參考鍵中的第一個*並獲取其值,然後根據該值對元素進行排序。

1>by後面是雜湊型別

SORT mykey BY post:*->time desc;

取鍵mykey的值替換* ,就是post:值,獲取鍵post:值的值進行倒序排列。

2>by後面是字串型別

SORT mykey by post:* desc;

note:1.  如果by後面的參考鍵名沒有包含*,sort命令將不會執行排序操作

        2.  如果幾個元素的參考鍵值相同,則sort命令會在比較元素本身的值來決定元素的順序。

        3.  當某個元素的參考鍵不存在時,會預設參考鍵的值為0

        4.  參考鍵雖然支援雜湊型別,但是*只能出現在->符號的前面,出現在後面redis不會認為是常量鍵名,結果還是按照元素大小進行排序,這個比較特殊

GET 引數

SORT命令的get引數,不影響排序,作用是使sort命令的返回結果不再是元素自身的值,而是get引數指定的鍵值,get引數的規則和by引數的規則一樣,get引數也支援字串型別和雜湊型別的鍵,並使用*作為佔位符。要實現在排序後直接返回Id對應的文章標題。

實現按照時間排序後直接返回Id對應的文章標題

sort tag:ruby:posts by posts:->time desc get posts:*->title

1> 一個sort命令中可以有多個get引數(而by引數只能有一個)

sort tag:ruby:posts by post:* -> time desc get post:*->title get post:*->time 

2> 如果有n個get引數,每個元素返回的結果就有N行,get  #返回的是元素本身,就是上面例子中

鍵 tag:ruby:posts  的 元素

sort tag:ruby:posts by post:*->time desc get post:*->title get # 

STORE引數

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

,直接在sort命令的後面加上sort 鍵 名,並且有鍵的型別會是列表型別,如果鍵已經存在則會覆蓋它,加上store引數後,sort命令的返回值為結果的個數

sort tag:ruby:posts by post:*->time desc get post:*->title store sort.result

效能優化

sort命令的事件複雜度是O(n+mlog(m)),其中n表示要排序的列表(集合或者有序集合中元素的個數),m表示要返回的元素個數。

當n較大時候sort命令的效能相對較低,並且redis在排序前會建立一個長度為n的容器來儲存待排序的元素。

sort命令使用注意:

1> 儘可能減少待排序鍵中元素的資料量 (使n儘可能小)

2>使用limit引數獲取需要的資料 (使m儘可能小)

3>如果要排序的資料量大,可以使用store引數快取結果,便於再次使用



相關文章