ZSet相較于Set來說,它又是有序的,這個有序指的就是我們通常意義上的有序了,ZSet內部中是按照升序來排序的。
排序規則:ZSet相較于Set來說,它內部引入了一個新的屬性:分數(Score),浮點類型,對于每一個member都有一個Score與之對應,member是要求唯一的,但是Score是可以重復的,排序的依據就是Score,如果Score重復的話,則按照字典序進行排序。
命令
普通操作
1.Zadd
完整語法:
Zadd key [NX|XX]? ?[GT|LT]? ?[ch] [Incr]? Score member? [Score? member.....]
作用是添加元素。時間復雜度為O(logn)。
參數:
[NX|XX]:NX表示只添加不更新,如果已經存在,即使Score不同也會添加失敗。XX:表示只更新,不添加。默認情況為不存在就添加,存在的話就更新分數。
[GT|LT]:GT表示比原來Score大才更新,LT就表示比原來Score分數小才更新。
[CH]:不寫CH返回的是添加的個數,如果寫上CH則將更新的也包含在內。主要適用于XX,因為它只更新不添加,返回值默認為0。
[Incr]:對元素進行加減操作,默認為加,減的話使用負數來實現,使用后后面就只能指定一個Score和member了。(不能同時對多組member進行操作)。
2.Zrange
和List中Lrange類似,可以查詢一對下標構成的空間,但是Zrange可以在下標后加上WithScores來同時查詢member和Score,時間復雜度為O(logn);
3.Zcard?
Zcard key
獲取key中的元素個數。
4.ZCount key min max
獲取Score在min和max中的元素個數,值得注意的是Max和Min為閉區間,如果想要為開區間可以在前面加上(,即(min (max,同時Redis引入了兩個特殊值:inf:表示無窮大,-inf:表示無窮小。
5.Zrevrange
用法和Zrange一樣,只不過是逆序返回罷了。
阻塞版本命令
6.ZpopMax
ZpopMax key [count]
刪除并返回分數最高的count個元素。
7.BzpopMax
BzpopMax key[key....] timeout
ZpopMax的阻塞版本,提供timeout來指定最長阻塞時間,支持小數,單位s。但是和ZpopMax不同的是不可以指定刪除的個數。
8.ZpopMin
ZpopMin key [count]
刪除Zset中Score最小的count個元素。
9.BzpopMin key[key...] timeout
和BzpopMax用法一樣,這里不做過多贅述。
值得注意的是以上操作的時間復雜度都是O(logn)(內部編碼為ziplist時為O(N)),這是因為SkipList沒有維護頭部指針和尾部指針,即使是頭/尾刪,仍然需要遍歷。
10.Zrank key member
時間復雜度為O(logN)。
作用是獲取key中member的排名(下標)。
11.ZrevRank key member
也是獲取member的排名,只不過是逆序(降序)。
12.Zscore key member
查找指定元素的分數,但是時間復雜度為O(1)!,這是因為Redis同時維護了一個哈希表,使得查找復雜度為O(1)。
13.Zrem key member [member....]
刪除指定的元素,返回刪除的個數。
14.ZremRangeByRank key start stop?
范圍刪除,把從start到stop之間的全刪了(根據下標)。
15.ZremRangeByScore key? min max
指定一個刪除區間,通過分數來描述。
16.ZincrBy key increment member
給指定的member增加increment(支持小數)。
集合間操作
Zinter,Zunion,Zdiff從Redis6.2才支持,用法和ZinterStore,ZunionStore類似,這里不過多解釋了。
17.ZinterStore
ZinterStore destination numbers? key [key.....] [weights....] [Aggregate <Sum|Min|Max>]
求并集并存儲到destination中。
numbers:指定有多少個key參與運算,避免key和后面的參數混肴。
weights:權重,就是每個key中Score要乘的倍數,如果要使用的話,前面必須要加上weights關鍵字。
Aggregate <Sum|Min|Max>:Sum表示取分數之和(默認情況),Min表示取分數最小的,Max表示取分數最大的,使用前要加上Aggregate關鍵字。
18.ZunionStore
ZunionStore destination bunbers key[key....] [weights...]?Aggregate <Sum|Min|Max>]
用法和ZinterStore一樣,只不過求的是合集罷了。
Zset內部編碼
1.ziplist
如果有序集合的元素比較少而且單個元素的體積較小,使用ziplist存儲。
2.skipList
復雜的鏈表,一個節點上有很多的指針,讓查詢時間更短(O(logn))。
Zset應用場景
1.最常見的場景,排行榜系統。
2.還可以使用集合操作來對熱點信息進行排序,例如微博熱度可以使用加權對評論,轉發,瀏覽來進行加權,得出一個分數。