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命令中的介紹隘截。