006.Redis基本數(shù)據(jù)結(jié)構(gòu)五:有序集合

1. 有序集合簡(jiǎn)介

有序集合保留了集合中不能有重復(fù)成員的特性,同時(shí)又對(duì)集合中的元素進(jìn)行排序孙技。列表是使用索引下標(biāo)作為
排序的依據(jù)潦嘶,有序集合則是給每個(gè)元素設(shè)置一個(gè)分?jǐn)?shù)(score)作為排序的依據(jù)。

2. 常用命令

# (1) 添加元素:ZADD key [NX|XX] [CH] [INCR] score value
# NX:value必須不存在才可以添加成功
# XX:value必須存在才可以添加成功,用于更新
# CH:返回score或者value發(fā)生變化的個(gè)數(shù)
# INCR:score
# 返回添加成功的個(gè)數(shù)
beh07:6379> ZADD students 100 tom
(integer) 1
beh07:6379> ZADD students 98 tony
(integer) 1
beh07:6379> ZADD students CH 77 bob 88 tom
(integer) 2
# 在原來(lái)score的基礎(chǔ)上+87晶渠,返回增加之后的分值
beh07:6379> ZADD students INCR 87 jack
"174"

# (2) 統(tǒng)計(jì)元素個(gè)數(shù)
beh07:6379> ZCARD students
(integer) 4

# (3) 獲取元素分值
beh07:6379> ZSCORE students tom
"88"

# (4) 計(jì)算排名
# 獲取[m,n]位排序后的元素,[0,-1]代表獲取全部元素,默認(rèn)是使用score升序排序
beh07:6379> ZRANGE students 0 -1
1) "bob"
2) "tom"
3) "tony"
4) "jack"
# 獲取[m,n]位排序后的元素首昔,[0,-1]代表獲取全部元素,降序排序糙俗,withscores參數(shù)可以返回分?jǐn)?shù)
beh07:6379> ZREVRANGE students 0 2 WITHSCORES
1) "jack"
2) "174"
3) "tony"
4) "98"
5) "tom"
6) "88"
# 獲取指定value的排名(升序勒奇,從0開始)
beh07:6379> ZRANK students tom
(integer) 1
# 獲取指定vaue的排名(降序,從0開始)
beh07:6379> ZREVRANK students tom
(integer) 2

# (5) 刪除元素
beh07:6379> ZREM students jack
(integer) 1

# (6) 增加分?jǐn)?shù)
beh07:6379> ZSCORE students tom
"88"
beh07:6379> ZINCRBY students 12 tom
"100"

# (7) 返回指定排名范圍的成員
# 返回倒數(shù)前3名
beh07:6379> zrange students 0 2 withscores
1) "Eirene"
2) "92"
3) "Habiba"
4) "93"
5) "Isoke"
6) "94"
# 返回前3名
beh07:6379> zrevrange students 0 2 withscores
1) "tom"
2) "100"
3) "Miki"
4) "99"
5) "tony"
6) "98"

# (8) 返回指定分?jǐn)?shù)范圍的成員
# zrangebyscore key min max [withscores] [limit offset count]
# zrevrangebyscore key min max [withscores] [limit offset count]
# zrangebyscore升序巧骚,zrevrangebyscore降序
# 指定的范圍min和max都會(huì)包括到輸出范圍,[min, max]
# [limit offset count]用于限制輸出的起始位置和個(gè)數(shù)
beh07:6379> zrangebyscore students 95 99 withscores
 1) "Jayne"
 2) "95"
 3) "Joy"
 4) "96"
 5) "Kirima"
 6) "97"
 7) "Laura"
 8) "98"
 9) "tony"
10) "98"
11) "Miki"
12) "99"
# +inf:正無(wú)窮赊颠,-inf:負(fù)無(wú)窮
beh07:6379> zrangebyscore students 95 +inf withscores
 1) "Jayne"
 2) "95"
 3) "Joy"
 4) "96"
 5) "Kirima"
 6) "97"
 7) "Laura"
 8) "98"
 9) "tony"
10) "98"
11) "Miki"
12) "99"
13) "tom"
14) "100"
beh07:6379> zrangebyscore students -inf 90 withscores
1) "bob"
2) "77"
3) "Allen"
4) "90"
# 從第4名開始輸出2個(gè)結(jié)果(第一名索引為0)
beh07:6379> zrangebyscore students -inf +inf withscores limit 3 2
1) "Eirene"
2) "92"
3) "Habiba"
4) "93"
# 支持開區(qū)間,'('代表開區(qū)間,默認(rèn)是閉區(qū)間
beh07:6379> zrangebyscore students (90 93 withscores
1) "Danica"
2) "91"
3) "Eirene"
4) "92"
5) "Habiba"
6) "93"
beh07:6379> zrangebyscore students 90 (93 withscores
1) "Allen"
2) "90"
3) "Danica"
4) "91"
5) "Eirene"
6) "92"
beh07:6379> zrangebyscore students (90 (93 withscores
1) "Danica"
2) "91"
3) "Eirene"
4) "92"

# (9) 返回指定分?jǐn)?shù)范圍內(nèi)的成員個(gè)數(shù)
beh07:6379> zcount students 90 100
(integer) 12

# (10) 刪除指定排名內(nèi)的成員
# 升序排序劈彪,刪除前3名
beh07:6379> zremrangebyrank students 0 2
(integer) 3

# (11) 刪除指定分?jǐn)?shù)范圍內(nèi)的成員
beh07:6379> zremrangebyscore students 95 99
(integer) 6

# (12) 刪除指定值的元素
beh07:6379> zrem students tom
(integer) 1

3. 集合間操作

準(zhǔn)備測(cè)試數(shù)據(jù):

beh07:6379> zadd user1 67 Allen 88 Mike 98 Candy 97 Ella 99 Hebe 56 Wawa
(integer) 6
beh07:6379> zadd user2 73 Bob 82 Mike 43 Hebe 77 Wawa
(integer) 4
# (1) 交集
# 對(duì)集合user1和user2做交集竣蹦,結(jié)果保存到user_inter1集合中
# 數(shù)字2的意思做交集的集合的個(gè)數(shù),zinterstore user_inter_tmp n user1 user2 ... usern
beh07:6379> zinterstore user_inter1 2 user1 user2 
(integer) 3
# 可以看到對(duì)于相同的value的分?jǐn)?shù)做了加法
beh07:6379> zrange user_inter1 0 -1 withscores
1) "Wawa"
2) "133"
3) "Hebe"
4) "142"
5) "Mike"
6) "170"
# 指定權(quán)重沧奴,默認(rèn)為1
beh07:6379> zinterstore user_inter2 2 user1 user2 WEIGHTS 1 0.5 AGGREGATE max
(integer) 3
# 最終分?jǐn)?shù)的計(jì)算過(guò)程 score = max(user1.value.score * 1, user2.value.score * 0.5)
# 支持的聚合操作有max/min/sum痘括,默認(rèn)使用sum
beh07:6379> zrange user_inter2 0 -1 withscores
1) "Wawa"
2) "56"
3) "Mike"
4) "88"
5) "Hebe"
6) "99"

# (2) 并集
# zunionstore的參數(shù)用法與zinterstore相同
beh07:6379> zunionstore user_union1 2 user1 user2
(integer) 7
beh07:6379> zrange user_union1 0 -1 withscores
 1) "Allen"
 2) "67"
 3) "Bob"
 4) "73"
 5) "Ella"
 6) "97"
 7) "Candy"
 8) "98"
 9) "Wawa"
10) "133"
11) "Hebe"
12) "142"
13) "Mike"
14) "170"
beh07:6379> zunionstore user_union2 2 user1 user2 WEIGHTS 1 0.5 AGGREGATE MIN
(integer) 7
beh07:6379> zrange user_union2 0 -1 withscores
 1) "Hebe"
 2) "21.5"
 3) "Bob"
 4) "36.5"
 5) "Wawa"
 6) "38.5"
 7) "Mike"
 8) "41"
 9) "Allen"
10) "67"
11) "Ella"
12) "97"
13) "Candy"
14) "98"

4. 內(nèi)部編碼

相關(guān)參數(shù):

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

當(dāng)有序集合中的元素個(gè)數(shù)小于zset-max-ziplist-entries配置的值同時(shí)每個(gè)元素的大小不超過(guò)64字節(jié)時(shí),使用ziplist作為底層實(shí)現(xiàn)滔吠,否則使用skiplist作為底層實(shí)現(xiàn)

beh07:6379> zadd zset1 1 tom
(integer) 1
beh07:6379> object encoding zset1
"ziplist"

beh07:6379> zadd zset2 1 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
(integer) 1
beh07:6379> object encoding zset2
"skiplist"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纲菌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子屠凶,更是在濱河造成了極大的恐慌驰后,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矗愧,死亡現(xiàn)場(chǎng)離奇詭異灶芝,居然都是意外死亡郑原,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門夜涕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)犯犁,“玉大人,你說(shuō)我怎么就攤上這事女器∷嵋郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵驾胆,是天一觀的道長(zhǎng)涣澡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)丧诺,這世上最難降的妖魔是什么入桂? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮驳阎,結(jié)果婚禮上抗愁,老公的妹妹穿的比我還像新娘。我一直安慰自己呵晚,他們只是感情好蜘腌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饵隙,像睡著了一般撮珠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上癞季,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天劫瞳,我揣著相機(jī)與錄音,去河邊找鬼绷柒。 笑死志于,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的废睦。 我是一名探鬼主播伺绽,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗜湃!你這毒婦竟也來(lái)了奈应?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤购披,失蹤者是張志新(化名)和其女友劉穎杖挣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刚陡,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惩妇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年株汉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌殃。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乔妈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓皱,到底是詐尸還是另有隱情路召,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布波材,位于F島的核電站股淡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏各聘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一躲因、第九天 我趴在偏房一處隱蔽的房頂上張望忌傻。 院中可真熱鬧大脉,春花似錦水孩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宙刘。三九已至,卻和暖如春悬包,著一層夾襖步出監(jiān)牢的瞬間衙猪,已是汗流浹背布近。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撑瞧,地道東北人棵譬。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像预伺,于是被迫代替她去往敵國(guó)和親订咸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琅束,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348