有序集合(sorted set)是在集合(set)的基礎(chǔ)上為集合中的每個(gè)元素都關(guān)聯(lián)了一個(gè)分?jǐn)?shù)臣淤,這使得我們不僅可以完成插入淋硝、刪除和判斷元素是否存在等集合類型支持的操作损话,還能獲得分?jǐn)?shù)最高或最低的前N個(gè)元素、獲得指定分?jǐn)?shù)范圍內(nèi)的元素等與分?jǐn)?shù)相關(guān)的操作碑宴。雖然集合中的每個(gè)元素都是不同的殖属,但是他們的分?jǐn)?shù)卻可以相同姐叁。
有序集合在某些方面和列表類型有些相似
1)二者都是有序的
2)二者都可以獲得某一范圍的元素
但是二者也有很大的區(qū)別,這使得他們的應(yīng)用場(chǎng)景也不相同洗显。
1)列表類型是通過鏈表實(shí)現(xiàn)的外潜,獲取靠近兩端的數(shù)據(jù)速度極快,而當(dāng)元素增多后挠唆,訪問中間元素的速度會(huì)比較慢处窥,所以它更適合實(shí)現(xiàn)如“新鮮事”或“日志”這樣很少訪問中間元素的應(yīng)用。
2)有序集合類型是使用散列表和跳躍表(skip list)實(shí)現(xiàn)的损搬,所以即使讀取位于中間的數(shù)據(jù)速度也很快(時(shí)間復(fù)雜度是O(log(N))碧库。
3)列表中不能簡(jiǎn)單的調(diào)整某個(gè)元素的位置柜与,但是有序集合可以(通過更改這個(gè)元素的分?jǐn)?shù))。
4)有序集合要比列表類型更耗費(fèi)內(nèi)存嵌灰。
命令
1弄匕、增加元素
ZADD key score member [score member ...]
ZADD命令用來向有序集合中增加一個(gè)元素和該元素的分?jǐn)?shù),如果元素已經(jīng)存在則會(huì)用新的分?jǐn)?shù)替換原有分?jǐn)?shù)沽瞭,此命令返回的使新增加到集合中的元素個(gè)數(shù)迁匠。分?jǐn)?shù)可以是整數(shù)也可以是浮點(diǎn)數(shù),其中+inf 和-inf分表表示正無窮和負(fù)無窮驹溃。
2城丧、獲得元素的分?jǐn)?shù)
ZSCORE key member
3、獲得排名在某個(gè)范圍的元素列表
ZRANGE? ? key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGE命令會(huì)按照元素分?jǐn)?shù)從小到大的順序返回索引從start到stop之間的所有元素(包含兩端的元素)豌鹤。ZRANGE命令與LRANGE命令十分相似亡哄,如索引都是從0開始,負(fù)數(shù)代表從后向前查找(-1表示最后一個(gè)元素)布疙。如果需要同時(shí)獲得元素的分?jǐn)?shù)的話在ZRANGE命令尾部加上WITHSCORES參數(shù)蚊惯,這時(shí)返回的數(shù)據(jù)格式就從“元素1,元素2灵临,...截型,元素N”變?yōu)椤霸?,分?jǐn)?shù)1儒溉,元素2宦焦,分?jǐn)?shù)2,...顿涣,元素N波闹,分?jǐn)?shù)N”。
ZRANGE命令的時(shí)間復(fù)雜度是O(log n + m)(其中n 為有序集合的技術(shù)园骆,M為返回的元素個(gè)數(shù))舔痪,如果兩個(gè)元素的分?jǐn)?shù)相同寓调,Redis會(huì)按照字典順序來進(jìn)行排序锌唾。
ZREVRANGE與ZRANGE唯一的不同就在于ZREVRANGE命令是按照元素分?jǐn)?shù)從大到小的順序給出結(jié)果的。
4夺英、獲取指定分?jǐn)?shù)范圍的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZRANGEBYSCORE命令的參數(shù)雖多晌涕,但是相對(duì)好理解,此命令按照元素分?jǐn)?shù)從大到小的順序返回分?jǐn)?shù)在min 和max之間(包含兩端)的元素痛悯。
如果希望分?jǐn)?shù)范圍不好喊端點(diǎn)值余黎,可以在分?jǐn)?shù)前面加上“(”符號(hào),例如如果希望返回80到100的數(shù)據(jù)载萌,可以包含80但是不包含100惧财,命令:ZRANGEBYSCORE key 80 (100
min 和max還支持無窮大巡扇,同ZADD一樣-inf和+inf分表表示負(fù)無窮和正無窮,比如希望拿到所有高于80分的數(shù)據(jù)(不包含80分)垮衷,ZRANGEBYSCORE key (80 +inf
WITHSCORES與前面的ZRANGE用法相同厅翔,LIMIT offset count 與sql的語法基本相同,即在獲得的元素列表的基礎(chǔ)上向后偏移offset個(gè)元素搀突,并且只獲得前count個(gè)元素刀闷。
5、增加某個(gè)元素的分?jǐn)?shù)
ZINCRBY key increment member
ZINCRBY可以增加一個(gè)元素的分?jǐn)?shù)仰迁,返回值是更改后的分?jǐn)?shù)甸昏。如果increment為負(fù)數(shù)則表示減分。
6徐许、獲得集合中元素的數(shù)量
ZCARD key
7施蜜、獲得指定分?jǐn)?shù)范圍內(nèi)的元素個(gè)數(shù)
ZCOUNT key min max
ZCOUNT命令的min 和max參數(shù)的特性和ZRANGEBYSCORE命令中的一樣。
8雌隅、刪除一個(gè)或多個(gè)元素
ZREM key member [member ..]
此命令返回成功刪除的元素的數(shù)量
9花墩、按照排名范圍刪除元素
ZREMRANGEBYRANK key start stop
ZREMRANGEBYRANK命令按照元素分?jǐn)?shù)從小到大的順序刪除在指定排名范圍內(nèi)的所有元素,并返回刪除的元素個(gè)數(shù)澄步。
10冰蘑、按照分?jǐn)?shù)范圍刪除元素
ZREMRANGEBYSCORE key min max
ZREMRANGEBYSCORE命令會(huì)刪除指定分?jǐn)?shù)范圍內(nèi)的所有元素,參數(shù)min和max特性跟ZRANGEBYSCORE命令中一樣村缸,返回值是刪除的元素?cái)?shù)量祠肥。
11、獲得元素的排名
ZRANK key member
ZREVRANK key member
ZRANK命令會(huì)哦按照元素分?jǐn)?shù)從小到大的順序獲得指定的元素排名(從0開始)梯皿。ZREVRANK命令則相反仇箱。
12、計(jì)算有序集合的交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight...]] [AGGREGATE SUM | MIN | MAX]
ZINTERSTORE命令用來計(jì)算多個(gè)有序集合的交集并將結(jié)果存儲(chǔ)在destination鍵中(同樣以有序集合類型存儲(chǔ))东羹,返回值為destination鍵中元素的個(gè)數(shù)剂桥。
destination鍵中元素的分?jǐn)?shù)是由AGGREGATE參數(shù)決定的。
1)當(dāng)AGGREGATE是SUM時(shí)(也就是默認(rèn))属提,destination鍵中元素的分?jǐn)?shù)是每個(gè)參與計(jì)算的集合中該元素分?jǐn)?shù)的和权逗。
2)當(dāng)AGGREGATE是MIN時(shí),destination鍵中元素的分?jǐn)?shù)是每個(gè)參與計(jì)算的集合中該元素分?jǐn)?shù)的最小值冤议。
3)當(dāng)AGGREGATE是MAX時(shí)斟薇,destination鍵中元素的分時(shí)是每個(gè)參與計(jì)算的集合中該元素分?jǐn)?shù)的最大值。
ZINTERSTORE命令還能通過WEIGHTS 參數(shù)設(shè)置沒每個(gè)集合的權(quán)重恕酸,每個(gè)集合在參與計(jì)算式元素的分?jǐn)?shù)會(huì)被乘上該集合的權(quán)重堪滨。
另外還有一個(gè)命令與ZINTERSTORE命令用法一樣,名為ZUNIONSTORE他的作用是計(jì)算集合間的并集蕊温。