1. 程式人生 > 程式設計 >Redis 的命令詳解 - Sorted Set 篇

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 引數,返回的是發生變化的成員總數
  • 同時指定 INCRCH 引數,只要 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是有序集合中的元素數。

返回有序集合中,分數介於 minmax 之間的成員數量,包括min也包括max。

語法

ZCOUNT key min max

返回值

分數介於 minmax 之間的成員數量,如果key不存在,返回0

ZLEXCOUNT : 獲取集合在某兩個成員之間的成員個數

起始版本 : 2.8.9
時間複雜度 : O(log(N)),其中N是有序集合中的元素數。

返回有序集合中,介於 minmax 之間的成員數量。這裡的 minmax 指的不是分數,而是成員。min 是分數小點的成員,max 是分數大點的成員,如果min成員的分數比max成員的分數還大,返回值為0

由於 Sorted Set 是有序集合(按分數從小到大排序),所以可以通過成員來搜尋

語法

ZLEXCOUNT key min max

返回值

介於 minmax 之間的成員數量,包括min也包括max,如果key不存在,返回0

與 ZCOUNT的區別

ZLEXCOUNTZCOUNT 語法、作用、返回值都相同,區別在於

  • 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為有序集合中元素的數量

BZPOPMAXZPOPMAX 命令的阻塞版,當有序集合中沒有成員時,會阻塞,指定有新成員新增進來或超時。

除此之外,BZPOPMAX 還可以指定多個key,當指定多個key時,按照引數中key的順序,彈出第一個非空集合中分數最大的成員

語法

BZPOPMAX key1 [key2 ...] timeout

timeout 為超時時間,單位秒。設定為 0 表示無限超時

返回值

key名稱、成員名稱和分數,超時則返回 nil

BZPOPMIN : (阻塞式)刪除分數最小成員

起始版本 : 5.0.0
時間複雜度 : O(log(N)),其中N為有序集合中元素的數量

BZPOPMINZPOPMIN 命令的阻塞版,當有序集合中沒有成員時,會阻塞,指定有新成員新增進來或超時。

除此之外,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 引數後,還會返回成員的對應分數

列表順序按分數從大到小排序,分數相同按成員位元組陣列排序