Redis數(shù)據(jù)類型及操作:Sorted Set

sorted sets類型及操作

sorted set是set的一個升級版本曹阔,它在set的基礎(chǔ)上增加了一個順序?qū)傩裕@一屬性在添加修改元素的時候可以指定蚁趁,每次指定后疙挺,zset會自動重新按新的值調(diào)整順序〗0埃可以理解為有兩列的mysql表,一列存value爽醋,一列存順序蚁署。操作中key理解為zset的名字。

和set一樣sorted set也是string類型元素的集合蚂四,不同的是每個元素都會關(guān)聯(lián)一個double類型的score光戈。sorted set的實現(xiàn)是skip list和hash table的混合體。

當(dāng)元素被添加到集合中時遂赠,一個元素到score的映射被添加到hash table中久妆,所以給定一個元素獲取score的開銷是O(1),另一個score到元素的映射被添加到skip list,并按照score排序跷睦,所以就可以有序的獲取集合中的元素筷弦。添加,刪除操作開銷都是O(log(N))和skip list的開銷一致,redis的skip list實現(xiàn)用的是雙向鏈表,這樣就可以逆序從尾部取元素抑诸。sorted set最經(jīng)常的使用方式應(yīng)該是作為索引來使用.我們可以把要排序的字段作為score存儲烂琴,對象的id當(dāng)元素存儲。

下面是sorted set相關(guān)命令

zadd

向名稱為key的zset中添加元素member蜕乡,score用于排序奸绷。如果該元素已經(jīng)存在,則根據(jù)score更新該元素的順序
`redis 127.0.0.1:6379> zadd myzset 1 "one"
(integer) 1
redis 127.0.0.1:6379> zadd myzset 2 "two"
(integer) 1
redis 127.0.0.1:6379> zadd myzset 3 "two"
(integer) 0
redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "3"
    redis 127.0.0.1:6379>`

本例中我們向myzset中添加了one和two层玲,并且two被設(shè)置了2次号醉,那么將以最后一次的設(shè)置為準(zhǔn),最后我們將所有元素都顯示出來并顯示出了元素的score辛块。

zrem

刪除名稱為key的zset中的元素member
`redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "3"
    redis 127.0.0.1:6379> zrem myzset two
    (integer) 1
    redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
  5. "one"
  6. "1"
    redis 127.0.0.1:6379>`

可以看到two被刪除了

zincrby

如果在名稱為key的zset中已經(jīng)存在元素member畔派,則該元素的score增加increment;否則向集合中添加該元素润绵,其score的值為increment
`redis 127.0.0.1:6379> zadd myzset2 1 "one"
(integer) 1
redis 127.0.0.1:6379> zadd myzset2 2 "two"
(integer) 1
redis 127.0.0.1:6379> zincrby myzset2 2 "one"
"3"
redis 127.0.0.1:6379> zrange myzset2 0 -1 withscores

  1. "two"
  2. "2"
  3. "one"
  4. "3"
    redis 127.0.0.1:6379>`

本例中將one的score從1增加了2父虑,增加到了3

zrank

返回名稱為key的zset中member元素的排名(按score從小到大排序)即下標(biāo)
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
  7. "five"
  8. "5"
    redis 127.0.0.1:6379> zrank myzset3 two
    (integer) 1
    redis 127.0.0.1:6379>`
    本例中將two的下標(biāo)是1,我這里取的是下標(biāo)授药,而不是score

zrevrank

返回名稱為key的zset中member元素的排名(按score從大到小排序)即下標(biāo)
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
  7. "five"
  8. "5"
    redis 127.0.0.1:6379> zrevrank myzset3 two
    (integer) 2 redis 127.0.0.1:6379>`
    按從大到小排序的話two是第三個元素士嚎,下標(biāo)是2

zrevrange

返回名稱為key的zset(按score從大到小排序)中的index從start到end的所有元素
`redis 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores

  1. "five"
  2. "5"
  3. "three"
  4. "3"
  5. "two"
  6. "2"
  7. "one"
  8. "1"
    redis 127.0.0.1:6379>`
    首先按score從大到小排序呜魄,再取出全部元素

zrangebyscore

返回集合中score在給定區(qū)間的元素
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
  7. "five"
  8. "5"
    redis 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores
  9. "two"
  10. "2"
  11. "three"
  12. "3"
    redis 127.0.0.1:6379>`
    本例中,返回了score在2~3區(qū)間的元素

zcount

返回集合中score在給定區(qū)間的數(shù)量
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
  7. "five"
  8. "5"
    redis 127.0.0.1:6379> zcount myzset3 2 3
    (integer) 2
    redis 127.0.0.1:6379>`
    本例中莱衩,計算了score在2~3之間的元素數(shù)目

zcard

返回集合中元素個數(shù)
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
  7. "five"
  8. "5"
    redis 127.0.0.1:6379> zcard myzset3
    (integer) 4
    redis 127.0.0.1:6379>`
    從本例看出myzset3這個集全的元素數(shù)量是4

zscore

返回給定元素對應(yīng)的score
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
  7. "five"
  8. "5"
    redis 127.0.0.1:6379> zscore myzset3 two
    "2"
    redis 127.0.0.1:6379>`
    此例中我們成功的將two的score取出來了爵嗅。

zremrangebyrank

刪除集合中排名在給定區(qū)間的元素
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
  7. "five"
  8. "5"
    redis 127.0.0.1:6379> zremrangebyrank myzset3 3 3
    (integer) 1
    redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
  9. "one"
  10. "1"
  11. "two"
  12. "2"
  13. "three"
  14. "3" redis 127.0.0.1:6379>`
    在本例中我們將myzset3中按從小到大排序結(jié)果的下標(biāo)為3的元素刪除了。

在本例中我們將myzset3中按從小到大排序結(jié)果的下標(biāo)為3的元素刪除了笨蚁。

刪除集合中score在給定區(qū)間的元素
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

  1. "one"
  2. "1"
  3. "two"
  4. "2"
  5. "three"
  6. "3"
    redis 127.0.0.1:6379> zremrangebyscore myzset3 1 2
    (integer) 2
    redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
  7. "three"
  8. "3"
    redis 127.0.0.1:6379>`
    在本例中我們將myzset3中按從小到大排序結(jié)果的score在1~2之間的元素刪除了睹晒。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市括细,隨后出現(xiàn)的幾起案子伪很,更是在濱河造成了極大的恐慌,老刑警劉巖奋单,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锉试,死亡現(xiàn)場離奇詭異,居然都是意外死亡览濒,警方通過查閱死者的電腦和手機(jī)呆盖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贷笛,“玉大人应又,你說我怎么就攤上這事》啵” “怎么了株扛?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汇荐。 經(jīng)常有香客問我席里,道長,這世上最難降的妖魔是什么拢驾? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任奖磁,我火速辦了婚禮,結(jié)果婚禮上繁疤,老公的妹妹穿的比我還像新娘咖为。我一直安慰自己,他們只是感情好稠腊,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布躁染。 她就那樣靜靜地躺著,像睡著了一般架忌。 火紅的嫁衣襯著肌膚如雪吞彤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音饰恕,去河邊找鬼挠羔。 笑死,一個胖子當(dāng)著我的面吹牛埋嵌,可吹牛的內(nèi)容都是我干的破加。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼雹嗦,長吁一口氣:“原來是場噩夢啊……” “哼范舀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起了罪,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锭环,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泊藕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辅辩,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年吱七,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹤竭。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡踊餐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臀稚,到底是詐尸還是另有隱情吝岭,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布吧寺,位于F島的核電站窜管,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稚机。R本人自食惡果不足惜幕帆,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赖条。 院中可真熱鬧失乾,春花似錦、人聲如沸纬乍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仿贬。三九已至纽竣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜓氨。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工聋袋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人语盈。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓舱馅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刀荒。 傳聞我的和親對象是個殘疾皇子代嗤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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