1. 程式人生 > >Redis自學筆記:4.3進階-排序

Redis自學筆記:4.3進階-排序

4.3排序

4.3.1有序集合的集合操作

有序集合沒有zinter和zunion命令,使用其他命令實現方法:

multi
zinterstore tempKey ...
zrange tempKey ...
del tempKey
exec

4.3.2 sort命令

sort key [alpha] [asc|desc] [limit offset count]
sort命令可以對列表型別、集合型別和有序集合型別進行排序,並且完成與
關係資料庫中連線查詢相類似的任務

127.0.0.1:6379> lpush bar 1 23 6 98 999 55 6.3
7
127.0.0.1:6379> sort bar
1
6
6.3
23
55
98
999

在對有序集合型別排序會忽略元素的分組,只針對元素自身的值進行排序

127.0.0.1:6379> zadd baz 100 9 800 2 500 5 700 3 400 6
5
127.0.0.1:6379> sort baz
2
3
5
6
9
127.0.0.1:6379> zrange baz 0 -1
9
6
5
3
2

sort命令還可以通過alpha引數實現按照字典順序排列非數字元素

127.0.0.1:6379> lpush quux book good look food wood tool
6
127.0.0.1:6379> sort quux alpha
book
food
good
look
tool
wood

sort命令的desc引數可以實現將元素按照從大到小排列(預設asc升序)

127.0.0.1:6379> sort quux alpha desc
wood
tool
look
good
food
book

sort命令limit offset count引數,表示跳過前offset個元素並獲取之後
的count個元素.

127.0.0.1:6379> sort quux alpha asc limit 1 3
food
good
look

4.3.3 by引數

sort key ... by 參考鍵 [asc|desc]
參考鍵可以是字串型別或則雜湊型別鍵的某個欄位(鍵名->)
如果提供了by引數,sort命令將不再依據元素自身的值進行排序,
而是對每個元素使用元素的值替換參考鍵中第一個"*"並獲取其值,
然後依據該值對元素排序.

字串型別:

127.0.0.1:6379> lrange book 0 -1
Python
Tangshi
Sanguo
127.0.0.1:6379> get book:Python
price:36
127.0.0.1:6379> get book:Sanguo
price:48
127.0.0.1:6379> get book:Tangshi
price:28
127.0.0.1:6379> sort book by book:* alpha
Tangshi
Python
Sanguo

雜湊型別:

127.0.0.1:6379> hset bok:Python price 36
1
127.0.0.1:6379> hset bok:Tangshi price 28
1
127.0.0.1:6379> hset bok:Sanguo price 48
1
127.0.0.1:6379> sort book by bok:*->price
Tangshi
Python
Sanguo
  • 參考鍵的用來比較的值相同時,sort命令會再比較元素的大小來絕對二者順序
  • 參考鍵雖然支援雜湊型別,但是 * 只能在 -> 前面.否則返回值是元素本身大小排序.

4.3.4 get引數

get引數不影響排序,它的作用是sort命令返回結果是get引數指定的鍵值.
get引數的規則和by引數一樣,get引數也支援字串和雜湊型別,並使用 * 作為佔位符.

127.0.0.1:6379> hset bok:Sanguo name SanGuoYanYi
1
127.0.0.1:6379> hset bok:Tangshi name Tangshi300
1
127.0.0.1:6379> hset bok:Python name PythonStart
1
127.0.0.1:6379> sort book by bok:*->price get bok:*->name
Tangshi300
PythonStart
SanGuoYanYi

在一個sort命令可以有多個get引數(by引數只能一個).

127.0.0.1:6379> hset bok:Python ZX 人民郵電出版社
1
127.0.0.1:6379> hset bok:Tangshi ZX 商務印書館
1
127.0.0.1:6379> hset bok:Sanguo ZX 人民文學出版社
1
127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX
Tangshi300
商務印書館
PythonStart
人民郵電出版社
SanGuoYanYi
人民文學出版社
  • get # 會返回元素本身的值
127.0.0.1:6379> sort book by bok:*->price get # get bok:*->name get bok:*->ZX
Tangshi
Tangshi300
商務印書館
Python
PythonStart
人民郵電出版社
Sanguo
SanGuoYanYi
人民文學出版社

4.3.5 store引數

預設情況下sort會直接返回排序結果,使用store引數會儲存結果.
例如把結果存入book.view鍵

127.0.0.1:6379> sort book by bok:*->price get bok:*->name get bok:*->ZX store book.view
6
127.0.0.1:6379> lrange book.view 0 -1
Tangshi300
商務印書館
PythonStart
人民郵電出版社
SanGuoYanYi
人民文學出版社

store引數常用來結合expire命令快取排序結果,虛擬碼如下:

# 排毒安是否存在之前排序結果的快取
$isCacheExists = EXISTS cache.sort
if $isCacheExists is 1
    # 如果存在直接返回
    return lrange chache.sort 0, -1
else
    # 如果不存在,則使用sort排序
    $sortResult = sort some.list store cache.sort
    # 設定快取的過期時間為10分組
    expire cache.sort, 600
    # 返回排序結果
    return $sortResult

4.3.6效能優化

sort是redis最強大最複雜的命令之一.sortd命令時間複雜度為O(n+mlog(m)),
其中n表示排序的的列表(集合或有序集合)中元素個數,m表示要返回的元素 個數.

當n較大是sort命令效能相對較低.所以開發中使用sort命令應注意以下幾點:

  1. 儘可能減少待排序鍵中元素的數量(使n儘可能少)
  2. 使用limit引數只獲取需要的資料(使m儘可能少)
  3. 如果排序的資料量較大,儘可能使用store引數將結果快取