Redis 的命令詳解 - Sorted Set 篇

相關文章redis

Redis 的命令詳解 - Key 篇
Redis 的命令詳解 - String 篇
Redis 的命令詳解 - Hash 篇
Redis 的命令詳解 - List 篇
Redis 的命令詳解 - SET 篇算法

未完待續!!!數組

Sorted Set 命令詳解

跟 SET 相關的命令一共有 25 種,這裏只介紹經常使用的,其餘請參考官網bash

ZADD : 添加成員

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

向有序集合(sorted set)中,添加 分數/成員(score/member)對,能夠同時指定多個分數/成員(score/member)對。函數

分數值是一個帶符號帶雙精度浮點型數字字符串。post

  • 若是指定的成員已經在有序集合中,則會更新改爲員的分數(scrore)並更新到正確的排序位置。
  • 若是key不存在,將會建立一個新的有序集合(sorted set)並將分數/成員(score/member)對添加到有序集合。

歷史

redis 版本 >= 2.4 時,ZADD 命令接受多個成員。 在Redis 2.4之前,ZADD 命令只能添加或者更新一個成員。ui

語法

ZADD key [NX|XX] [CH] [INCR] score1 member1 [score2 member2 ...]spa

score 是分數,放在前面 member 是成員code

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 之間的成員數量。

語法

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 之間的成員數量,若是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 參數後,還會返回成員的對應分數

列表順序按分數從大到小排序,分數相同按成員字節數組排序

相關文章
相關標籤/搜索