Redis命令詳解:Sorted Sets

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

BZPOPMAX

最早可用版本:5.0.0

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

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

BZPOPMAX是ZPOPMAX的原始阻塞版脏榆。如果沒有存在sorted set不能pop出元素,則連接會被阻塞台谍。該命令會返回第一個非空的有序set的最高分的元素须喂。

timeout參數(shù)是用來指定最大的阻塞時間,如果是0,則無限阻塞坞生。

當(dāng)沒有元素被pop出仔役,并且阻塞時間達(dá)到timeout時,返回nil是己。

如果有元素被pop出又兵,則返回三個值:第一個是該元素來自哪個zset,第二個是pop元素的score卒废,第三個是pop元素的value沛厨。

BZPOPMIN

最早可用版本:5.0.0

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

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

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

ZADD

最早可用版本:1.2.0

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

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

將所有指定的成員和它的score加入zset电谣,如果要插入的成員已經(jīng)存在,則會更新該成員的分?jǐn)?shù)抹蚀,并將它排到正確的位置剿牺。如果key不存在,則創(chuàng)建一個新的zset并且插入成員况鸣。如果key存在牢贸,但不是zset類型竹观,就會報錯镐捧。score是雙精度的浮點數(shù),+inf和-inf同樣有效臭增。

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

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

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

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

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

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

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

ZCARD

最早可用版本:1.2.0

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

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

ZCOUNT

最早可用版本:2.0.0

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

用法:ZCOUNT key min max

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

ZCOUNT命令的時間復(fù)雜度為O(log(N))冠句,因為它使用了ZRANK進(jìn)行排序轻掩,然后獲取范圍的成員個數(shù)。

ZINCRBY

最早可用版本:1.2.0

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

用法:ZINCRBY key increment member

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

ZINTERSTORE

最早可用版本:2.0.0

時間復(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命令用于計算給出的numkeys個zset的交集客峭,并將結(jié)果保存到destination中豫领。在給出要計算的key和其他參數(shù)之前,必須先給出numkeys舔琅。默認(rèn)情況下等恐,輸出的zset成員的分?jǐn)?shù),會是輸入的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用來對每一個zset設(shè)置一個乘數(shù)因子课蔬,在計算分?jǐn)?shù)時乘以指定的數(shù)值,默認(rèn)是1郊尝。

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

如果destination已經(jīng)存在样傍,則覆蓋原來的值。命令的返回值是結(jié)果的成員個數(shù)铺遂。

ZLEXCOUNT

最早可用版本:2.8.9

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

用法:ZLEXCOUNT key min max

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

關(guān)于min和max:

  • 成員名稱前需要加上[撤逢,[符號和成員名稱之間不能有空格
  • 可以使用-和+表示最大值和最小值
  • 計算數(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

時間復(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)返回多個元素時,分?jǐn)?shù)最高的最先被返回筝闹。

ZPOPMIN

最早可用版本:5.0.0

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

該命令和ZPOPMAX相反关顷,返回的是分?jǐn)?shù)最低的元素糊秆。只有這點不同,其他都相同议双。

ZRANGE

最早可用版本:1.2.0

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

用法:ZRANGE key start stop [WITHSCORES]

該命令返回指定范圍的成員平痰,按照分?jǐn)?shù)從低到高的順序排汞舱。start和stop都是從0開始,也可以是負(fù)數(shù)觉增,-1表示倒數(shù)第一個兵拢。返回的時候包括start和stop位置的成員翻斟。

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

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

ZRANGEBYLEX

最早可用版本:2.8.9

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

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

前面我們提到過,當(dāng)所有的成員的分?jǐn)?shù)相同時窒篱,它們會按照字典順序排列焕刮。對于中情況舶沿,ZRANGEBYLEX命令就是用來返回指定區(qū)間成員的。指定成員時可以使用(或者[配并,(表示不包含指定的成員括荡,[表示包含。

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

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

ZRANGEBYSCORE

最早可用版本:1.0.5

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

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

這個命令用來返回指定分?jǐn)?shù)范圍的成員梧油,包括min和max苫耸。如果分?jǐn)?shù)相同,則按字典順序排列儡陨。

LIMIT參數(shù)用來分頁鲸阔。

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

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

ZRANGEBYSCORE zset (1 5

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

ZRANK

最早可用版本:2.0.0

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

該命令用于返回指定的成員從低到高的排名叙身。返回值從0開始渔扎,第一個元素的rank是0,第二個是1……

如果成員存在信轿,返回它的rank值晃痴;如果不存在,返回nil财忽。

ZREM

最早可用版本:1.2.0

時間復(fù)雜度:O(M*log(N))倘核,N是zset的成員數(shù)量,M是要刪除的成員數(shù)量

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

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

ZREMRANGEBYLEX

最早可用版本:2.8.9

時間復(fù)雜度:O(log(N)+M)隶校,N是zset的成員數(shù)量漏益,M是要刪除的成員數(shù)量

用法:ZREMRANGEBYLEX key min max

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

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

ZREMRANGEBYRANK

最早可用版本:2.0.0

時間復(fù)雜度:O(log(N)+M)舞终,N是zset的成員數(shù)量轻庆,M是要刪除的成員數(shù)量

用法:ZREMRANGEBYRANK key start stop

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

ZREMRANGEBYSCORE

最早可用版本:1.2.0

時間復(fù)雜度:O(log(N)+M)余爆,N是zset的成員數(shù)量煎谍,M是要刪除的成員數(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

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

用法:ZREVRANGE key start stop [WITHSCORES]

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

ZREVRANGEBYLEX

最早可用版本:1.2.0

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

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

ZREVRANGEBYSCORE

最早可用版本:2.2.0

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

是ZRANGEBYSCORE命令的倒序。

ZREVRANK

最早可用版本:2.0.0

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

是ZRANK的倒序隘擎。

ZSCAN

最早可用版本:2.8.0

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

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

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

ZSCORE

最早可用版本:1.2.0

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

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

ZUNIONSTORE

最早可用版本:2.0.0

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

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

計算給出的zset的并集,并把結(jié)果存到destination蹲姐,在給定要計算的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)容合作請聯(lián)系作者
  • 序言:七十年代末扎阶,一起剝皮案震驚了整個濱河市汹胃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌东臀,老刑警劉巖着饥,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惰赋,居然都是意外死亡宰掉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門赁濒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轨奄,“玉大人,你說我怎么就攤上這事拒炎∨材猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵击你,是天一觀的道長玉组。 經(jīng)常有香客問我,道長丁侄,這世上最難降的妖魔是什么惯雳? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鸿摇,結(jié)果婚禮上吨凑,老公的妹妹穿的比我還像新娘。我一直安慰自己户辱,他們只是感情好鸵钝,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庐镐,像睡著了一般恩商。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上必逆,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天怠堪,我揣著相機與錄音,去河邊找鬼名眉。 笑死粟矿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的损拢。 我是一名探鬼主播陌粹,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼福压!你這毒婦竟也來了掏秩?” 一聲冷哼從身側(cè)響起或舞,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒙幻,沒想到半個月后映凳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡邮破,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年诈豌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抒和。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡队询,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出构诚,到底是詐尸還是另有隱情蚌斩,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布范嘱,位于F島的核電站送膳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丑蛤。R本人自食惡果不足惜叠聋,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望受裹。 院中可真熱鬧碌补,春花似錦、人聲如沸棉饶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽照藻。三九已至袜啃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幸缕,已是汗流浹背群发。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留发乔,地道東北人熟妓。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像栏尚,于是被迫代替她去往敵國和親起愈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容