Redis 數(shù)據(jù)結(jié)構(gòu)簡介

? ??????【文章僅供非商業(yè)用途或交流學(xué)習(xí)使用】

? ? ? ? 簡介

? ? ? ? 使用ANSI C語言編寫戚嗅,遵守BSD協(xié)議霸株。

? ? ? ? Redis用結(jié)構(gòu)化的value滿足業(yè)務(wù)的多樣性需求相味,常用的類型有5種:string秽梅、list恭理、set拯辙、map、sorted-set颜价。

? ? ? ? 一涯保、String類型

? ? ? ? 1? 簡介

????????Redis的String類型能夠表達3種類型:字節(jié)串、整數(shù)周伦、浮點數(shù)

? ? ? ? 三種類型之間根據(jù)具體場景由Redis完成相互間的自動轉(zhuǎn)型夕春,并且根據(jù)需要選取底層的承載方式。

? ? ? ? 針對String類型的value還具備簡單的CAS操作专挪,根據(jù)指定Key是否存在設(shè)置value值及志。

? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)

? ? ? ? 在Redis內(nèi)部,作為字節(jié)串承載的String型value內(nèi)部以int寨腔,sds(simple dynamic string)作為結(jié)構(gòu)存儲速侈。int用來存放整形數(shù)據(jù),sds存放字節(jié) / 字符串和浮點型數(shù)據(jù)迫卢。

? ? ? ? 二倚搬、List類型

? ? ? ? 1? 簡介

? ? ? ? List即列表對象,用于存儲String隊列乾蛤。

? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)

? ? ? ? List類型的value對象內(nèi)部以linkedlist或ziplist承載每界。當(dāng)List的元素個數(shù)和單個元素的長度較小時,Redis會采用ziplist實現(xiàn)以減少內(nèi)存占用幻捏,否則采用linkedlist結(jié)構(gòu)。

? ? ? ? 3? linkedlist實現(xiàn)

? ? ? ? linkedlist內(nèi)部實現(xiàn)是雙向鏈表

? ? ? ? 4? ziplist實現(xiàn)

? ? ? ? ziplist作為List對象承載實現(xiàn)時命咐,通常用于List的元素個數(shù)不多且元素本身長度不大的情況篡九。

? ? ? ? 三、Map類型

? ? ? ? 1? 簡介

????????Map型的value在Redis中又叫Hash醋奠,顧名思義榛臼,它的最初實現(xiàn)是一個哈希表。Map的語義和多數(shù)程序語言語義一致:包含若干個key-value窜司,其中key不重復(fù)沛善。

? ? ? ? map內(nèi)部key和value不能再嵌套map了,它只能是String所能表達的內(nèi)容:整形塞祈、浮點型金刁、字節(jié)串。

? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)

? ? ? ? map可以用hashtable和ziplist兩種承載方式來實現(xiàn)。對于數(shù)據(jù)量較小的map尤蛮,采用ziplist實現(xiàn)媳友。

? ? ? ? 3? hashtable實現(xiàn)

? ? ? ? 4? ziplist實現(xiàn)

? ? ? ? 這里的ziplist和List的ziplist實現(xiàn)相似,都是通過entry來存放element产捞,和List不同的是醇锚,map的ziplist的奇數(shù)位存放key,偶數(shù)位存放對應(yīng)的value坯临,通常情況下焊唬,只有很少幾個kv對的map,采用ziplist效率反而更高看靠,省去了hash計算赶促、內(nèi)存尋址等操作。尤其對于長字符串key衷笋,其hash值計算本身的開銷甚至遠大于順序遍歷時字符串比較的開銷芳杏。

? ? ? ? 四、Set類型

? ? ? ? 1? 簡介

????????Set類似List辟宗,但它是一個無序集合爵赵,其中的元素不重復(fù)。

? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)

? ? ? ? Set在Redis中以insert或hashtable來存儲泊脐。后者前述章節(jié)已介紹空幻,對于Set,hashtable中的vlaue永遠為NULL容客。當(dāng)Set中只包含整數(shù)型的元素時秕铛,采用intset作為實現(xiàn)。

? ? ? ? 3? intset

? ? ? ? intset的核心元素是一個字節(jié)數(shù)組缩挑,其中從小到大有序地存放著set的元素但两,intset同樣針對小證書進行了性能優(yōu)化,對不同類型的整數(shù)采用變長的存儲供置,在元素均不大的情況下減少了內(nèi)存開銷谨湘。

? ? ? ? 五、Serted-Set類型

? ? ? ? 1? 簡介

? ? ? ? Sorted-Set是Redis特有的數(shù)據(jù)類型芥丧,類似Map是一個key-value對紧阔,但它是一個有序的key-value對:

? ? ? ? key:key-value對中的鍵,在一個sorted-set中不重復(fù)续担。

? ? ? ? value:是一個浮點數(shù)擅耽,成為score。

? ? ? ? 有序:sorted-set內(nèi)部按照score從小到大排序物遇。

? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)

? ? ? ? Sorted-Set類型的value對象內(nèi)部以ziplist或skiplist+hashtable來實現(xiàn)乖仇。

? ? ? ? ziplist適用于元素個數(shù)不多憾儒、元素內(nèi)容不大的場景。

? ? ? ? 對于更通用的場景这敬,sorted-set采用skiplist(跳表)來實現(xiàn)航夺。

? ? ? ? 3? skiplist

? ? ? ? 關(guān)于skiplist介紹:http://www.reibang.com/writer#/notebooks/36290124/notes/45470984

? ? ? ? 4? hashtable

? ? ? ? 跳表是一種實現(xiàn)順序相關(guān)操作的較高效的數(shù)據(jù)結(jié)構(gòu),但它對于簡單的ZSCORE操作效率并不高崔涂,Redis在實現(xiàn)sorted-set時阳掐,同時使用hashtable和skiplist。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冷蚂,一起剝皮案震驚了整個濱河市缭保,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝙茶,老刑警劉巖艺骂,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隆夯,居然都是意外死亡钳恕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門蹄衷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忧额,“玉大人,你說我怎么就攤上這事愧口∧婪” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵耍属,是天一觀的道長托嚣。 經(jīng)常有香客問我,道長厚骗,這世上最難降的妖魔是什么示启? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮领舰,結(jié)果婚禮上夫嗓,老公的妹妹穿的比我還像新娘。我一直安慰自己提揍,他們只是感情好啤月,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布煮仇。 她就那樣靜靜地躺著劳跃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浙垫。 梳的紋絲不亂的頭發(fā)上刨仑,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天郑诺,我揣著相機與錄音,去河邊找鬼杉武。 笑死辙诞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的轻抱。 我是一名探鬼主播飞涂,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祈搜!你這毒婦竟也來了较店?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤容燕,失蹤者是張志新(化名)和其女友劉穎梁呈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蘸秘,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡官卡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醋虏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寻咒。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灰粮,靈堂內(nèi)的尸體忽然破棺而出仔涩,到底是詐尸還是另有隱情,我是刑警寧澤粘舟,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布熔脂,位于F島的核電站,受9級特大地震影響柑肴,放射性物質(zhì)發(fā)生泄漏霞揉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一晰骑、第九天 我趴在偏房一處隱蔽的房頂上張望适秩。 院中可真熱鬧,春花似錦硕舆、人聲如沸秽荞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扬跋。三九已至,卻和暖如春凌节,著一層夾襖步出監(jiān)牢的瞬間钦听,已是汗流浹背洒试。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朴上,地道東北人垒棋。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像痪宰,于是被迫代替她去往敵國和親叼架。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345