Redis命令詳解:Sorted Sets

Sorted Set(也稱ZSET)和Set一樣也是string類型的集合,你可以將它理解為Java中SortedSet和HashMap的集合體,一方面它是一個(gè)set,保證了元素的唯一性,另一方面它給每個(gè)value賦予了一個(gè)權(quán)重score,用來(lái)進(jìn)行排序。集合中成員的最大個(gè)數(shù)為232-1個(gè)。

BZPOPMAX

最早可用版本:5.0.0

時(shí)間復(fù)雜度:O(log(N)),N是元素個(gè)數(shù)

用法:BZPOPMAX key [key ...] timeout

BZPOPMAX是ZPOPMAX的原始阻塞版。如果沒(méi)有存在sorted set不能pop出元素,則連接會(huì)被阻塞。該命令會(huì)返回第一個(gè)非空的有序set的最高分的元素。

timeout參數(shù)是用來(lái)指定最大的阻塞時(shí)間,如果是0,則無(wú)限阻塞。

當(dāng)沒(méi)有元素被pop出,并且阻塞時(shí)間達(dá)到timeout時(shí),返回nil。

如果有元素被pop出,則返回三個(gè)值:第一個(gè)是該元素來(lái)自哪個(gè)zset,第二個(gè)是pop元素的score,第三個(gè)是pop元素的value。

BZPOPMIN

最早可用版本:5.0.0

時(shí)間復(fù)雜度:O(log(N)),N是元素個(gè)數(shù)

用法:BZPOPMIN key [key ...] timeout

BZPOPMIN是ZPOPMIN的阻塞版本。它與BZPOPMAX相似,唯一不同的是它返回的是第一個(gè)非空有序set的最低分的元素。

ZADD

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(log(N)),N是元素個(gè)數(shù)

用法:ZADD key [NX|XX][CH][INCR]score member [score member ...]

將所有指定的成員和它的score加入zset,如果要插入的成員已經(jīng)存在,則會(huì)更新該成員的分?jǐn)?shù),并將它排到正確的位置。如果key不存在,則創(chuàng)建一個(gè)新的zset并且插入成員。如果key存在,但不是zset類型,就會(huì)報(bào)錯(cuò)。score是雙精度的浮點(diǎn)數(shù),+inf和-inf同樣有效。

在Redis3.2版本之后,ZADD命令支持了以下參數(shù):

  • XX:只更新已有的成員,不新增
  • NX:只新增成員,不更新
  • CH:將返回值從新增成員數(shù)修改為發(fā)生變化的成員總數(shù)
  • INCR:當(dāng)指定這個(gè)參數(shù)時(shí),ZADD命令和ZINCRBY相似,但是只能接受一個(gè)成員的參數(shù)
分?jǐn)?shù)的范圍

Redis的Sorted Set的分?jǐn)?shù)范圍從-(253)到+(253)。或者說(shuō)是-9007199254740992 到 9007199254740992。更大的整數(shù)在內(nèi)部用指數(shù)表示。

相同分?jǐn)?shù)的成員

由于所有的成員都是唯一的,當(dāng)分?jǐn)?shù)相同時(shí),成員將按照字典序進(jìn)行排序。它比較的是成員的字節(jié)數(shù)組,當(dāng)所有成員的分?jǐn)?shù)都相同時(shí),范圍查詢可以用ZRANGEBYLEX命令(分?jǐn)?shù)范圍查詢用ZRANGEBYSCORE命令)。

該命令返回值是新增成員的數(shù)量,如果是INCR參數(shù)模式,就返回新增成員的分?jǐn)?shù)。

Redis2.4版本以后該命令才支持指定多個(gè)成員/分?jǐn)?shù)對(duì)。

ZCARD

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(1)

當(dāng)key存在時(shí),返回zset的成員數(shù)量;否則返回0。

ZCOUNT

最早可用版本:2.0.0

時(shí)間復(fù)雜度:O(log(N)),N是zset的成員個(gè)數(shù)

用法:ZCOUNT key min max

返回分?jǐn)?shù)在min到max(默認(rèn)包括min和max)之間的成員個(gè)數(shù)。

ZCOUNT命令的時(shí)間復(fù)雜度為O(log(N)),因?yàn)樗褂昧薢RANK進(jìn)行排序,然后獲取范圍的成員個(gè)數(shù)。

ZINCRBY

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(log(N)),N是zset的成員個(gè)數(shù)

用法:ZINCRBY key increment member

給指定zset中的指定的成員加上increment分?jǐn)?shù)。如果成員不存在,則新增成員,將分?jǐn)?shù)置為increment。如果key不存在,則先創(chuàng)建一個(gè)zset,然后加入新的成員。命令的返回值是成員的新分?jǐn)?shù)。

ZINTERSTORE

最早可用版本:2.0.0

時(shí)間復(fù)雜度:O(N * K)+O(M * log(M)),N是輸入的zset中的最小的成員數(shù)量,K為輸入的zset的數(shù)量。M是結(jié)果中zset的成員數(shù)量

用法:ZINTERSTORE destination numkeys key [key ...][WEIGHTS weight [weight ...]][AGGREGATE SUM|MIN|MAX]

ZINTERSTORE命令用于計(jì)算給出的numkeys個(gè)zset的交集,并將結(jié)果保存到destination中。在給出要計(jì)算的key和其他參數(shù)之前,必須先給出numkeys。默認(rèn)情況下,輸出的zset成員的分?jǐn)?shù),會(huì)是輸入的zset的成員的分?jǐn)?shù)之和。

127.0.0.1:6379> ZADD myzset1 1 "jackey"
(integer) 1
127.0.0.1:6379> ZADD myzset1 2 "zhe"
(integer) 1
127.0.0.1:6379> ZADD myzset2 1 "jackey"
(integer) 1
127.0.0.1:6379> ZADD myzset2 2 "zhe"
(integer) 1
127.0.0.1:6379> ZADD myzset2 3 "2018"
(integer) 1
127.0.0.1:6379> ZINTERSTORE deszset 2 myzset1 myzset2
(integer) 2
127.0.0.1:6379> ZRANGE deszset 0 -1 WITHSCORES
1) "jackey"
2) "2"
3) "zhe"
4) "4"

WEIGHTS用來(lái)對(duì)每一個(gè)zset設(shè)置一個(gè)乘數(shù)因子,在計(jì)算分?jǐn)?shù)時(shí)乘以指定的數(shù)值,默認(rèn)是1。

AGGREGATE參數(shù)用來(lái)指定分?jǐn)?shù)的聚合策略,默認(rèn)是SUM,也就是相加。還可以選擇取最大或最小的分?jǐn)?shù)。

如果destination已經(jīng)存在,則覆蓋原來(lái)的值。命令的返回值是結(jié)果的成員個(gè)數(shù)。

ZLEXCOUNT

最早可用版本:2.8.9

時(shí)間復(fù)雜度:O(log(N)),N是zset的成員個(gè)數(shù)

用法:ZLEXCOUNT key min max

當(dāng)所有成員的分?jǐn)?shù)都相同時(shí),使用這個(gè)命令計(jì)算min和max之間的成員個(gè)數(shù)。

關(guān)于min和max:

  • 成員名稱前需要加上[,[符號(hào)和成員名稱之間不能有空格
  • 可以使用-和+表示最大值和最小值
  • 計(jì)算數(shù)量時(shí),包括min和max
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 e 0 d 0 i 0 f 0 k
(integer) 7
127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 7
127.0.0.1:6379> ZLEXCOUNT myzset b e
(error) ERR min or max not valid string range item
127.0.0.1:6379> ZLEXCOUNT myzset [b [e
(integer) 3
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "a"
2) "b"
3) "d"
4) "e"
5) "f"
6) "i"
7) "k"

ZPOPMAX

最早可用版本:5.0.0

時(shí)間復(fù)雜度:O(log(N)*M),N是zset的成員數(shù)量,M是彈出的成員數(shù)量

用法:ZPOPMAX key [count]

該命令用于移除并返回一定數(shù)量的分?jǐn)?shù)最高的成員。count默認(rèn)是1,count大于zset成員,當(dāng)返回多個(gè)元素時(shí),分?jǐn)?shù)最高的最先被返回。

ZPOPMIN

最早可用版本:5.0.0

時(shí)間復(fù)雜度:O(log(N)*M),N是zset的成員數(shù)量,M是彈出的成員數(shù)量

該命令和ZPOPMAX相反,返回的是分?jǐn)?shù)最低的元素。只有這點(diǎn)不同,其他都相同。

ZRANGE

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是返回的成員數(shù)量

用法:ZRANGE key start stop [WITHSCORES]

該命令返回指定范圍的成員,按照分?jǐn)?shù)從低到高的順序排。start和stop都是從0開(kāi)始,也可以是負(fù)數(shù),-1表示倒數(shù)第一個(gè)。返回的時(shí)候包括start和stop位置的成員。

如果start大于zset成員數(shù)量或者start大于stop,則返回空集合;如果stop大于最后一位,則返回start到最后一位的成員。

WITHSCORES參數(shù)表示返回的結(jié)果中是否要帶分?jǐn)?shù)。

ZRANGEBYLEX

最早可用版本:2.8.9

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是返回的成員數(shù)量

用法:ZRANGEBYLEX key min max [LIMIT offset count]

前面我們提到過(guò),當(dāng)所有的成員的分?jǐn)?shù)相同時(shí),它們會(huì)按照字典順序排列。對(duì)于中情況,ZRANGEBYLEX命令就是用來(lái)返回指定區(qū)間成員的。指定成員時(shí)可以使用(或者[,(表示不包含指定的成員,[表示包含。

成員字符串作為二進(jìn)制數(shù)組來(lái)排序,默認(rèn)是ASCII字符集的順序。

LIMIT參數(shù)用于分頁(yè),類似于SQL中的LIMIT關(guān)鍵字。

ZRANGEBYSCORE

最早可用版本:1.0.5

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是返回的成員數(shù)量

用法:ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]

這個(gè)命令用來(lái)返回指定分?jǐn)?shù)范圍的成員,包括min和max。如果分?jǐn)?shù)相同,則按字典順序排列。

LIMIT參數(shù)用來(lái)分頁(yè)。

在Redis2.0以后,可用使用WITHSCORES參數(shù),使返回值中帶有分?jǐn)?shù)。

我們可以使用(表示不包括指定的分?jǐn)?shù),舉個(gè)栗子:

ZRANGEBYSCORE zset (1 5

取的分?jǐn)?shù)范圍是1<score<=5

ZRANK

最早可用版本:2.0.0

時(shí)間復(fù)雜度:O(log(N))

該命令用于返回指定的成員從低到高的排名。返回值從0開(kāi)始,第一個(gè)元素的rank是0,第二個(gè)是1……

如果成員存在,返回它的rank值;如果不存在,返回nil。

ZREM

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(M*log(N)),N是zset的成員數(shù)量,M是要?jiǎng)h除的成員數(shù)量

從zset中刪除指定的成員。返回值為實(shí)際刪除的成員數(shù)量。

Redis2.4版本以后支持一次指定多個(gè)成員。

ZREMRANGEBYLEX

最早可用版本:2.8.9

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是要?jiǎng)h除的成員數(shù)量

用法:ZREMRANGEBYLEX key min max

該命令用于刪除指定返回的成員,最好用于所有分?jǐn)?shù)都相同的集合,否則結(jié)果會(huì)不準(zhǔn)確。

關(guān)于min和max的描述可以查看ZRANGEBYLEX命令。

ZREMRANGEBYRANK

最早可用版本:2.0.0

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是要?jiǎng)h除的成員數(shù)量

用法:ZREMRANGEBYRANK key start stop

用于刪除指定rank范圍的成員。start和stop的介紹可以查看ZRANGE命令。

ZREMRANGEBYSCORE

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是要?jiǎng)h除的成員數(shù)量

用法:ZREMRANGEBYSCORE key min max

刪除指定分?jǐn)?shù)范圍的成員,默認(rèn)包括min和max的分?jǐn)?shù),在2.1.6版本以后可以不包括min和max,具體可以查看ZRANGEBYSCORE命令。

ZREVRANGE

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是要返回的成員數(shù)量

用法:ZREVRANGE key start stop [WITHSCORES]

返回分?jǐn)?shù)從高到低的成員,也就是說(shuō),順序與ZRANGE相反。其他條件都相同。

ZREVRANGEBYLEX

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是要返回的成員數(shù)量

該命令是ZRANGEBYLEX命令的倒序版本。

ZREVRANGEBYSCORE

最早可用版本:2.2.0

時(shí)間復(fù)雜度:O(log(N)+M),N是zset的成員數(shù)量,M是要返回的成員數(shù)量

是ZRANGEBYSCORE命令的倒序。

ZREVRANK

最早可用版本:2.0.0

時(shí)間復(fù)雜度:O(log(N))

是ZRANK的倒序。

ZSCAN

最早可用版本:2.8.0

時(shí)間復(fù)雜度:每次調(diào)用為O(1)

用法:ZSCAN key cursor [MATCH pattern][COUNT count]

這是一個(gè)SCAN類的命令,可以看這里進(jìn)行更深入的了解。

ZSCORE

最早可用版本:1.2.0

時(shí)間復(fù)雜度:O(1)

該命令用于返回指定成員的分?jǐn)?shù)。如果指定成員不存在或者key不存在,則返回nil。

ZUNIONSTORE

最早可用版本:2.0.0

時(shí)間復(fù)雜度:O(N)+O(M log(M)),N是輸入的zset的大小之和,M是結(jié)果的zset的大小

用法:ZUNIONSTORE destination numkeys key [key ...][WEIGHTS weight [weight ...]][AGGREGATE SUM|MIN|MAX]

計(jì)算給出的zset的并集,并把結(jié)果存到destination,在給定要計(jì)算的key和其他參數(shù)之前,要給出numkeys,也就是key的數(shù)量。默認(rèn)情況下,結(jié)果中的成員的分?jǐn)?shù),是輸入的zset的該成員分?jǐn)?shù)的和。

關(guān)于WEIGHTS和AGGREGATE參數(shù),可以查看ZINTERSTORE命令中的介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容