Redis 的命令詳解 - Sorted Set 篇
相關文章
Redis 的命令詳解 - Key 篇
Redis 的命令詳解 - String 篇
Redis 的命令詳解 - Hash 篇
Redis 的命令詳解 - List 篇
Redis 的命令詳解 - SET 篇
歡迎糾錯(不管是錯字還是內容寫的有問題)!!!
Sorted Set 命令詳解
跟 SET 相關的命令一共有 25 種,這裡只介紹常用的,其他請參考官網
ZADD : 新增成員
起始版本 : 1.2.0
時間複雜度 : O(log(N)),其中N是有序集合中的元素數。
向有序集合(sorted set)中,新增 分數/成員(score/member)對,可以同時指定多個分數/成員(score/member)對。
分數值是一個帶符號帶雙精度浮點型數字字串。
- 如果指定的成員已經在有序集合中,則會更新改成員的分數(scrore)並更新到正確的排序位置。
- 如果key不存在,將會建立一個新的有序集合(sorted set)並將分數/成員(score/member)對新增到有序集合。
歷史
redis 版本 >= 2.4 時,ZADD
命令接受多個成員。 在Redis 2.4以前,ZADD
命令只能新增或者更新一個成員。
語法
ZADD key [NX|XX] [CH] [INCR] score1 member1 [score2 member2 ...]
score 是分數,放在前面 member 是成員
ZADD 引數
redis 版本 >= Redis 3.0.2時, ZADD支援以下引數
- XX : 只更新存在的成員,不新增新成員。
- NX : 不更新存在的成員。只新增新成員。
-
INCR : 當指定這個引數時,成員的操作就等同
ZINCRBY
命令,對成員的分數進行遞增操作,在此模式下只能指定一對分數/成員。 -
CH : 這個引數有點意思,它的作用是改變返回值!!!
- 沒有指定該引數時(預設情況下),返回的是新新增成員的總數,發生更新的成員不進行計數。
- 指定該引數後,返回的是發生變化的成員總數,即新新增的成員 + 發生更新的成員。(注意,如果一個成員已存在,並且分數也相同,則不會發生更新)
返回值
- 如果key存在,但是型別不是有序集合,將會返回一個錯誤應答。
- 如果指定了,INCR 引數,返回運算後的新分數
- 如果指定了,CH 引數,返回的是發生變化的成員總數
- 同時指定 INCR 和 CH 引數,只要 INCR 生效,返回運算後的新分數
- 即沒有指定 INCR 引數,又沒有指定 CH 引數,返回新新增的成員總數
分數可以精確的表示的整數的範圍
Redis 有序集合的分數使用雙精度64位浮點數。我們支援所有的架構,這表示為一個IEEE 754 floating point number,它能包括的整數範圍是-(2^53) 到 +(2^53)。或者說是-9007199254740992 到 9007199254740992。更大的整數在內部用指數形式表示,所以,如果為分數設定一個非常大的整數,你得到的是一個近似的十進位制數。
分數和排序
Sorted Set 按照分數遞增的方式進行排序。且不允許存在重複的成員。
分數可以通過ZADD
命令進行更新,也可以通過ZINCRBY
命令來修改之前的值,分數變化後,對應的成員的排序位置也會隨之改變。
獲取一個成員當前的分數可以使用ZSCORE
命令,也可以用它來驗證成員是否存在。
相同分數的成員
有序集合裡面的成員是不能重複的,但是不同成員間有可能有相同的分數。當多個成員有相同的分數時,將進行字典排序(ordered lexicographically)。
字典順序排序用的是二進位制,它比較的是字串的位元組陣列。
如果使用者將所有元素設定相同分數(例如0),有序集合裡面的所有元素將按照字典順序進行排序,範圍查詢元素可以使用ZRANGEBYLEX
命令
ZSCORE : 獲取成員的分數
起始版本 : 1.2.0
時間複雜度 : O(1)
語法
ZSCORE key member
返回值
成員的分數,成員不存在返回nil
ZREM : 刪除成員
起始版本 : 1.2.0
時間複雜度 : O(M*log(N)),其中N是有序集合中的元素數,M是要刪除的元素數。
刪除指定的成員key,不存在的成員將被忽略。
語法
ZREM key member [member ...]
返回值
刪除的成員數,不包括不存在的成員。
歷史
reids 版本 >= 2.4時,接受多個 member 引數
ZREMRANGEBYSCORE : 刪除給定分數間的所有成員
起始版本 : 1.2.0
時間複雜度 : O(M + log(N)),其中N是有序集合中的元素數,M是要刪除的元素數。
刪除分數在 min 和之間 max 之間的所有成員,包括min也包括max
語法
ZREMRANGEBYSCORE key min max
返回值
刪除的成員
ZREMRANGEBYRANK : 刪除指定下標間的所有成員
起始版本 : 2.0.0
時間複雜度 : O(M + log(N)),其中N是有序集合中的元素數,M是要刪除的元素數。
刪除開始下標和結束下標之間的所有成員,下標從0開始,支援負下標,-1表示最右端成員,包括開始下標也包括結束下標
語法
ZREMRANGEBYSCORE key start stop
返回值
刪除的成員
ZINCRBY : 增減成員的分數
起始版本 : 1.2.0
時間複雜度 : O(log(N)),其中N是有序集合中的元素數。
為有序集合中指定成員的分數加上一個帶符號的雙精度浮點數。
- 如果 key 不存在,先建立該有序集合
- 如果指定的成員不存在,先建立該成員,並初始化分數為0
score值必須是字串表示的整數值或雙精度浮點數,並且能接受double精度的浮點數。也有可能給一個負數來減少score的值。
語法
ZINCRBY key 帶符號的雙精度浮點數 member
返回值
- 相加後的分數
- 當key對應的value不是 Sorted Set 型別時,返回一個錯誤。
ZCARD : 獲取集合中成員的個數
起始版本 : 1.2.0
時間複雜度 : O(1)
語法
ZCARD key
返回值
集合中成員的個數,如果key不存在,返回0
ZCOUNT : 獲取集合在某個分數範圍內的成員個數
起始版本 : 2.0.0
時間複雜度 : O(log(N)),其中N是有序集合中的元素數。
返回有序集合中,分數介於 min 和 max 之間的成員數量,包括min也包括max。
語法
ZCOUNT key min max
返回值
分數介於 min 和 max 之間的成員數量,如果key不存在,返回0
ZLEXCOUNT : 獲取集合在某兩個成員之間的成員個數
起始版本 : 2.8.9
時間複雜度 : O(log(N)),其中N是有序集合中的元素數。
返回有序集合中,介於 min 和 max 之間的成員數量。這裡的 min 和 max 指的不是分數,而是成員。min 是分數小點的成員,max 是分數大點的成員,如果min成員的分數比max成員的分數還大,返回值為0
由於 Sorted Set 是有序集合(按分數從小到大排序),所以可以通過成員來搜尋
語法
ZLEXCOUNT key min max
返回值
介於 min 和 max 之間的成員數量,包括min也包括max,如果key不存在,返回0
與 ZCOUNT的區別
ZLEXCOUNT
與 ZCOUNT
語法、作用、返回值都相同,區別在於
-
ZCOUNT
使用分數來圈定範圍 -
ZLEXCOUNT
使用成員來圈定範圍(利用了 Sorted Set 是有序集合的性質)
ZPOPMAX : 刪除分數最大成員(右端彈出)
起始版本 : 5.0.0
時間複雜度 : O(log(N) * M),其中N是排序集中元素的數量,M是彈出元素的數量。
刪除並返回有序集合中 count 個分數最高的成員
- 如果 count 未指定,則預設值為1。
- 如果 count >= 有序集合中成員的數量,刪除並返回(彈出)所有成員
當 count > 1時,分數最高的將是第一個,其次是分數較低的元素。如果分數最高的有多個,按排列循序,從右到左,刪除並返回(彈出)。
官方的解釋繁瑣且不精確,這裡說一下我的解釋。由於 Sorted Set 是按照分數進行從小到大排序的,分數相同的按照成員的位元組陣列排序。所以 ZPOPMAX 的作用相當於右端彈出。
語法
ZPOPMAX key [count]
count 表示要彈出的個數
返回值
按照彈出循序的成員/分數對列表
ZPOPMIN : 刪除分數最小成員(左端彈出)
起始版本 : 5.0.0
時間複雜度 : O(log(N) * M),其中N是排序集中元素的數量,M是彈出元素的數量。
左端彈出指定個數的成員/分數對
- 如果 count 未指定,則預設值為1
- 如果 count >= 有序集合中成員的數量,刪除並返回(彈出)所有成員
語法
ZPOPMIN key [count]
count 表示要彈出的個數
返回值
按照彈出循序的成員/分數對列表
BZPOPMAX : (阻塞式)刪除分數最大成員
起始版本 : 5.0.0
時間複雜度 : O(log(N)),其中N為有序集合中元素的數量
BZPOPMAX
是 ZPOPMAX
命令的阻塞版,當有序集合中沒有成員時,會阻塞,指定有新成員新增進來或超時。
除此之外,BZPOPMAX
還可以指定多個key,當指定多個key時,按照引數中key的順序,彈出第一個非空集合中分數最大的成員
語法
BZPOPMAX key1 [key2 ...] timeout
timeout 為超時時間,單位秒。設定為 0 表示無限超時
返回值
key名稱、成員名稱和分數,超時則返回 nil
BZPOPMIN : (阻塞式)刪除分數最小成員
起始版本 : 5.0.0
時間複雜度 : O(log(N)),其中N為有序集合中元素的數量
BZPOPMIN
是 ZPOPMIN
命令的阻塞版,當有序集合中沒有成員時,會阻塞,指定有新成員新增進來或超時。
除此之外,BZPOPMIN
還可以指定多個key,當指定多個key時,按照引數中key的順序,彈出第一個非空集合中分數最小的成員
語法
BZPOPMIN key1 [key2 ...] timeout
timeout 為超時時間,單位秒。設定為 0 表示無限超時
返回值
key名稱、成員名稱和分數,超時則返回 nil
ZUNIONSTORE : 計算多個集合的並集,並儲存
起始版本 : 2.0.0
時間複雜度 : O(N) + O(M log(M)),其中 N 是所有集合的成員數量之和,M 是結果集中元素的數量。
計算指定個數的給定有序集合的並集,並將結果儲存在 destination 中。
必須提供 numkeys 引數,並且 numkeys 在 key 及其他可選引數之前
指定 WEIGHTS 引數,可以為每個有序集合指定一個權重。這意味著,在將每個有序集合中的成員分數傳遞給聚合函式之前,都要乘以該權重。如果 WEIGHTS 未指定,則權重預設為1。
指定 AGGREGATE 引數,可以指定如何合併並集的結果。預設使用 SUM 函式。當此選項設定為MIN或時MAX,結果集將選擇最小或最大分數的成員。
語法
ZUNIONSTORE destination numkeys key1 [key2 ...] [WEIGHTS weight1 [weight2 ...]] [AGGREGATE SUM | MIN | MAX]
- destination : 目標集合,存放運算後的結果集。如果目標集合存在則覆蓋。
- numkeys : 參與運算的集合數量(key的數量)
- WEIGHTS : 為每個集合指定權重,不指定時所有集合的權重預設為1。redis會將每個集合中的成員的分數 * 對應集合的權重
-
AGGREGATE : 彙總演演算法,預設使用 SUM。
- SUM : 將同一成員的分數相加
- MIN : 取同一成員中分數最小的
- MAX : 取同一成員中分數最大的
返回值
結果集中元素的個數
ZINTERSTORE : 計算多個集合的交集,並儲存
起始版本 : 2.0.0
時間複雜度 : O(N) + O(M log(M)),其中 N 是所有集合的成員數量之和,M 是結果集中元素的數量。
計算指定個數的給定有序集合的交集,並將結果儲存在 destination 中。
語法
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]
- destination : 目標集合,存放運算後的結果集。如果目標集合存在則覆蓋。
- numkeys : 參與運算的集合數量(key的數量)
- WEIGHTS : 為每個集合指定權重,不指定時所有集合的權重預設為1。redis會將每個集合中的成員的分數 * 對應集合的權重
-
AGGREGATE : 彙總演演算法,預設使用 SUM。
- SUM : 將同一成員的分數相加
- MIN : 取同一成員中分數最小的
- MAX : 取同一成員中分數最大的
返回值
結果集中元素的個數
ZRANK : 按分數從小到大獲取成員在有序集合中的排名
起始版本 : 2.0.0
時間複雜度 : O(log(N))
按分數從小到大獲取成員在有序集合中的排名,排名從0開始(也就是分數最小的排名為0,分數第二小的,排名為1...)
語法
ZRANK key member
返回值
成員對應的排名,如果key或成員不存在,返回nil
例子
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANK myzset "three"
(integer) 2
redis> ZRANK myzset "four"
(nil)
redis>
複製程式碼
ZREVRANK : 按分數從大到小獲取成員在有序集合中的排名
起始版本 : 2.0.0
時間複雜度 : O(log(N))
按分數從大到小獲取成員在有序集合中的排名,排名從0開始(也就是分數最大的排名為0,分數第二大的,排名為1...)
語法
ZREVRANK key member
返回值
成員對應的排名,如果key或成員不存在,返回nil
ZRANGE : 範圍獲取成員並按分數從小到大返回
起始版本 : 1.2.0
時間複雜度 : O(log(N) + M),N為有序集合中的元素數,M為返回的元素數。
返回開始下標和結束下標內的成員,並按照分數從小到大排序返回。
下標從0開始,支援負下標,-1表示最後一個成員,包括開始下標,也包括結束下標
由於 Sorted Set 是按分數從小到大排序,分數相同按成員位元組陣列排序,所以下標0表示最左邊的成員,下表 -1 表示最右邊的成員
下標超出範圍不會產生錯誤。如果開始下標 > 集合最大下標或開始下標 > 結束下標,則結果為一個空列表。
如果結束下標 > 集合最大下標,則將結束下標視為集合的最大下標
語法
ZRANGE key start stop [WITHSCORES]
- start : 開始下標
- stop : 結束下標
- WITHSCORES :指定此引數時,除了會返回成員外,還會返回成員對應的分數
返回值
指定範圍內的成員列表,如果指定了 WITHSCORES 引數,還會包含成員對應的分數。
列表順序按分數從小到大排序,分數相同按成員位元組陣列排序
ZREVRANGE : 獲取指定下標內的成員並按分數從大到小返回
起始版本 : 1.2.0
時間複雜度 : O(log(N) + M),N為有序集合中的元素數,M為返回的元素數。
返回開始下標和結束下標內的成員,並按照分數從大到小排序返回。
下標從0開始,支援負下標,-1表示最後一個成員,包括開始下標,也包括結束下標
由於 Sorted Set 是按分數從小到大排序,分數相同按成員位元組陣列排序,所以下標0表示最左邊的成員,下表 -1 表示最右邊的成員
下標超出範圍不會產生錯誤。如果開始下標 > 集合最大下標或開始下標 > 結束下標,則結果為一個空列表。
如果結束下標 > 集合最大下標,則將結束下標視為集合的最大下標
ZREVRANGE 命令與 ZRANGE 命令唯一的不同就是返回列表的順序
語法
ZREVRANGE key start stop [WITHSCORES]
- start : 開始下標
- stop : 結束下標
- WITHSCORES :指定此引數時,除了會返回成員外,還會返回成員對應的分數
返回值
指定範圍內的成員列表,如果指定了 WITHSCORES 引數,還會包含成員對應的分數。
列表順序按分數從大到小排序,分數相同按成員位元組陣列排序
ZRANGEBYSCORE : 獲取分數範圍內的成員並按從小到大返回
起始版本 : 1.0.5
時間複雜度 : O(log(N) + M),N為有序集合中的元素數,M為返回的元素數。如果M為常數(例如,始終要求使用LIMIT=10),則可以將其視為O(log(N))
返回分數在 min 和 max 之間的成員,包括min 也包括 max
語法
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- min : 小分數
- max : 大分數
- WITHSCORES : 設定該引數後,除了返回成員外,還會返回成員的對應分數,該引數在 Redis 2.0 開始可用
- LIMIT offset count : 分頁返回,offset 是結果集中的要返回成員的開始下標,count 是返回的條數,負數表示返回所有
返回值
成員列表,設定 WITHSCORES 引數後,還會返回成員的對應分數
列表順序按分數從小到大排序,分數相同按成員位元組陣列排序
ZREVRANGEBYSCORE : 獲取分數範圍內的成員並按大到小返回
起始版本 : 2.2.0
時間複雜度 : O(log(N) + M),N為有序集合中的元素數,M為返回的元素數。如果M為常數(例如,始終要求使用LIMIT=10),則可以將其視為O(log(N))
返回分數在 min 和 max 之間的成員,包括min 也包括 max
此命令與 ZRANGEBYSCORE
命令的唯一區別在於,返回結果的排序
-
ZRANGEBYSCORE
按分數從小到大排序,分數相同按成員位元組陣列排序 - 該命令按分數從大到小排序,分數相同按成員位元組陣列排序
語法
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- max : 大分數
- min : 小分數
- WITHSCORES : 設定該引數後,除了返回成員外,還會返回成員的對應分數
- LIMIT offset count : 分頁返回,offset 是結果集中的要返回成員的開始下標,count 是返回的條數,負數表示返回所有
返回值
成員列表,設定 WITHSCORES 引數後,還會返回成員的對應分數
列表順序按分數從大到小排序,分數相同按成員位元組陣列排序