Redis數(shù)據(jù)結(jié)構(gòu)及如何用好這些數(shù)據(jù)結(jié)構(gòu)

這篇文章延續(xù)精簡的風(fēng)格抹沪,爭取能讓大家8min內(nèi)讀完并有所收獲齿风。

概述

一周前的文章精簡的介紹了Redis核心原理及Redis是如何工作的和二,這一章回歸到Redis的本質(zhì)上來(存儲)先较。Redis之所以如此受歡迎洞就,一方面是性能強(qiáng)勁棍厌,另一方面就是支持多種常見的數(shù)據(jù)結(jié)構(gòu)肾胯,甚至能完成一定的數(shù)據(jù)運(yùn)算工作竖席,靈活性大大提升。

Redis的常用四大數(shù)據(jù)結(jié)構(gòu)類型敬肚,將一一介紹

1)String

2)List

3)Hash

4)Set


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


在文章Redis核心原理中介紹了毕荐,Redis字典的KV都是由redisObject組成的,每種Redis數(shù)據(jù)類型都是由不同的編碼方式和真實(shí)的底層數(shù)據(jù)類型(ptr)實(shí)現(xiàn)艳馒,本文先介紹底層數(shù)據(jù)實(shí)現(xiàn)


SDS


Redis string底層實(shí)現(xiàn)

struct sdshdr {????

????// 記錄 buf 數(shù)組中已使用字節(jié)的數(shù)量

????// 等于 SDS 所保存字符串的長度????

????int len;????

????// 記錄 buf 數(shù)組中未使用字節(jié)的數(shù)量????

????int free;????

????// 字節(jié)數(shù)組憎亚,用于保存字符串????

????char buf[];

};

1)獲取字符串長度的復(fù)雜度是O(1)

2)執(zhí)行append操作時,如果空間不足則自動分配新空間弄慰,不會導(dǎo)致buf溢出

3)當(dāng)字符串長度小于1MB時第美,將分配與len相同大小的未使用空間(如圖所示),目的是在空間占用和空間重分配之間取得平衡


LINKEDLIST


Redis鏈表實(shí)現(xiàn)

1)list是雙向鏈表陆爽,RPUSH LPUSH由此實(shí)現(xiàn)

2)獲取鏈表長度為O(1)


HASH TABLE

Redis 哈希表實(shí)現(xiàn)

1)獲取hash表size/used的復(fù)雜度為O(1)

2)有兩張hash表組成什往,如果沒有rehash狀態(tài)下,rehashidx為-1墓陈,且其中的一張表是空的恶守。當(dāng)rehash時,為了不影響redis的性能贡必,同時使用兩張表漸進(jìn)式的完成rehash:設(shè)置rehashidx為0兔港,當(dāng)查詢或修改key時把KV轉(zhuǎn)移到新表上去,直至舊表為空仔拟,設(shè)置rehashidx為-1衫樊,完成遷移

3)為什么hash table的長度是2的N次冪?因?yàn)閎ucket = hashcode & (len-1)利花,當(dāng)len為2的N次冪時len-1=1111科侈。。? 因此原有的對象只有少部分會被重新分配到新的bucket中去炒事,因?yàn)?len-1) -> (2*len-1)時只有最高位的0變成了1臀栈,會減少遷移的工作量,提高效率

INT SET


Redis的整數(shù)集合

1)獲取set length的復(fù)雜度為O(1)

2)encoding表明取值范圍及內(nèi)存占用挠乳,因此Redis并不適合將少量過大的數(shù)和大量小數(shù)值存在一起权薯,會造成空間浪費(fèi)

ZIPLIST


Redis的壓縮表

1)ziplist是鏈表和哈希表的底層實(shí)現(xiàn)之一

2)ziplist采用更緊湊的編碼,減少內(nèi)存使用

以下是Redis的數(shù)據(jù)結(jié)構(gòu)全貌

String

Redis字符串對象

List


ziplist實(shí)現(xiàn)的List


linked list實(shí)現(xiàn)的List

1)當(dāng)列表中的object數(shù)量小于512個時睡扬,redis使用ziplist這種占用空間更小的結(jié)構(gòu)

Hash


ziplist實(shí)現(xiàn)的哈希對象
ziplist實(shí)現(xiàn)的哈希對象


hashtable實(shí)現(xiàn)的哈希對象

1)當(dāng)哈希表中的object數(shù)量小于512個時盟蚣,Redis使用ziplist這種占用空間更小的結(jié)構(gòu)。雖然復(fù)雜度為O(N)卖怜,但由于object數(shù)量少屎开,不會對CPU造成影響

Set


intset只包含數(shù)值類型的set


其它set

1)當(dāng)一個set中全是數(shù)字時,采用intset為底層马靠,占用空間小奄抽,因?yàn)楸M量不要把少數(shù)string和大量int存儲在一個set里

總結(jié)

1)使用哈希表蔼两、列表及集合時,盡量不要使用big data及添加過多的數(shù)據(jù)如孝,因?yàn)檫@樣會導(dǎo)致存儲結(jié)構(gòu)從ziplist變?yōu)閔ash table宪哩、linkedlist等空間占用更大的數(shù)據(jù)結(jié)構(gòu)

2)如無必要的情況下,一個集合中不要將string和int混合存儲第晰,這會導(dǎo)致內(nèi)存占用變大

3)String不要過長锁孟,小于39字符時,使用embstr編碼格式茁瘦,占用更少內(nèi)存

4)set可以用來做數(shù)據(jù)運(yùn)算品抽,如交、并等大量數(shù)據(jù)的運(yùn)算

參考文檔

Redis設(shè)計與實(shí)現(xiàn)

Redis原理及應(yīng)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甜熔,一起剝皮案震驚了整個濱河市圆恤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腔稀,老刑警劉巖盆昙,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焊虏,居然都是意外死亡淡喜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門诵闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼团,“玉大人,你說我怎么就攤上這事疏尿∥林ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵褥琐,是天一觀的道長锌俱。 經(jīng)常有香客問我,道長敌呈,這世上最難降的妖魔是什么嚼鹉? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮驱富,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匹舞。我一直安慰自己褐鸥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布赐稽。 她就那樣靜靜地躺著叫榕,像睡著了一般浑侥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晰绎,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天寓落,我揣著相機(jī)與錄音,去河邊找鬼荞下。 笑死伶选,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尖昏。 我是一名探鬼主播仰税,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抽诉!你這毒婦竟也來了陨簇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迹淌,失蹤者是張志新(化名)和其女友劉穎河绽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唉窃,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耙饰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了句携。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榔幸。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矮嫉,靈堂內(nèi)的尸體忽然破棺而出削咆,到底是詐尸還是另有隱情,我是刑警寧澤蠢笋,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布拨齐,位于F島的核電站,受9級特大地震影響昨寞,放射性物質(zhì)發(fā)生泄漏瞻惋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一援岩、第九天 我趴在偏房一處隱蔽的房頂上張望歼狼。 院中可真熱鬧,春花似錦享怀、人聲如沸羽峰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梅屉。三九已至值纱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坯汤,已是汗流浹背虐唠。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惰聂,地道東北人疆偿。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像庶近,于是被迫代替她去往敵國和親翁脆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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