深入理解redis之基本數(shù)據(jù)結(jié)構(gòu)

本文是對(duì)redis系統(tǒng)中用到的基本數(shù)據(jù)結(jié)構(gòu)的梳理

1.sds 字符串

redis 中字符串?dāng)?shù)據(jù)結(jié)構(gòu)如下

struct sdshdr{
    int len; //已用長(zhǎng)度
    int free; //未使用數(shù)據(jù)長(zhǎng)度
    char buf[]; //數(shù)據(jù)指針
    
};

可以看到,在字符串的頭部,記錄了字符串對(duì)象當(dāng)前
使用的長(zhǎng)度以及剩余的空間大小尿赚。有了這個(gè)長(zhǎng)度可以杜絕字符串的溢出裸卫,也能基于len和free字段做字符串空間的預(yù)分配。

2.鏈表


struct list{
    listNode* head;
    listNode * tail;
    int len;
    void *(*dup)(void *ptr);//節(jié)點(diǎn)復(fù)制函數(shù)
    void(*free)(void *prt); //節(jié)點(diǎn)釋放函數(shù)
    void (*match)(void*ptr,void *key)//節(jié)點(diǎn)比對(duì)函數(shù)
    
    
}

雙向鏈表的實(shí)現(xiàn)沒有特別的地方淑蔚,這里值得借鑒的是,把函數(shù)指針當(dāng)做結(jié)構(gòu)體成員,這個(gè)就是c語(yǔ)言編寫面向?qū)ο蟪绦虻姆椒ā?/p>

3.字典

字典數(shù)據(jù)結(jié)構(gòu)示意圖:

image

redis的字典結(jié)構(gòu)底層是一個(gè)拉鏈法實(shí)現(xiàn)的哈希表。

值得注意的是一個(gè)字典結(jié)構(gòu)里實(shí)際上有兩個(gè)哈希表結(jié)構(gòu)象迎。目的是用來(lái)做rehash。

當(dāng)哈希表中元素過多或過少時(shí)呛踊,就需要對(duì)原來(lái)這個(gè)哈希表做rehash操作砾淌。

rehash本質(zhì)上是開一個(gè)新hash表,其空間是原先空間的指數(shù)倍放大或縮小。將原表上的每一個(gè)元素取出,重新hash并放入到新表中的過程谭网。

如果一次性將表中所有元素都rehash掉汪厨,其代價(jià)較大,redis 這里采用的方式是,每次訪問一個(gè)key時(shí)愉择,將val = hash(key)上的所有元素rehash掉劫乱。

4.跳躍表

跳躍表在redis 中用于解決zset的排序問題。

跳躍表的平均時(shí)間復(fù)雜度O(logn)锥涕,其空間復(fù)雜度為O(n)衷戈。

image

跳躍表的原理見:
https://www.cnblogs.com/George1994/p/7635731.html

5.整數(shù)集合

整數(shù)集合是redis set 類型的底層的實(shí)現(xiàn),當(dāng)一個(gè)集合中只包含整數(shù)值元素,并且這個(gè)集合的元素?cái)?shù)量不多時(shí)层坠,redis就會(huì)用整數(shù)集合作為底層實(shí)現(xiàn)殖妇。

目的在于:節(jié)省內(nèi)存

整數(shù)集合的數(shù)據(jù)結(jié)構(gòu)如下:

struct intset {
    uint32_t encoding;//說(shuō)明一個(gè)元素占多少空間。
    uint32_t length //元素個(gè)數(shù);
    int8_t contents[];
};

可以看到破花,實(shí)際上就是一個(gè)整數(shù)數(shù)組谦趣。數(shù)組中的值從小到大排序。

如果添加的新元素類型比當(dāng)前整數(shù)集合保存值的類型長(zhǎng)時(shí)需要做升級(jí)處理旧乞。

升級(jí)步驟:

  1. 擴(kuò)展數(shù)組空間
  2. 將已有元素?cái)U(kuò)展為新類型
  3. 放入新元素

6.壓縮列表

壓縮列表是列表和哈希表的底層實(shí)現(xiàn)之一蔚润。
當(dāng)列表/哈希表包含的對(duì)象較少磅氨,切對(duì)象是整數(shù)或者短字符串時(shí)尺栖,采用壓縮列表作為底層實(shí)現(xiàn)。

壓縮列表目的在于:節(jié)省內(nèi)存

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烦租,一起剝皮案震驚了整個(gè)濱河市延赌,隨后出現(xiàn)的幾起案子除盏,更是在濱河造成了極大的恐慌,老刑警劉巖挫以,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件者蠕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掐松,警方通過查閱死者的電腦和手機(jī)踱侣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)大磺,“玉大人抡句,你說(shuō)我怎么就攤上這事「芾ⅲ” “怎么了待榔?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)流济。 經(jīng)常有香客問我锐锣,道長(zhǎng),這世上最難降的妖魔是什么绳瘟? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任雕憔,我火速辦了婚禮,結(jié)果婚禮上糖声,老公的妹妹穿的比我還像新娘橘茉。我一直安慰自己,他們只是感情好姨丈,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布畅卓。 她就那樣靜靜地躺著,像睡著了一般蟋恬。 火紅的嫁衣襯著肌膚如雪翁潘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天歼争,我揣著相機(jī)與錄音拜马,去河邊找鬼。 笑死沐绒,一個(gè)胖子當(dāng)著我的面吹牛俩莽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乔遮,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扮超,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起出刷,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤璧疗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馁龟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崩侠,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年坷檩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了却音。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矢炼,死狀恐怖僧家,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裸删,我是刑警寧澤八拱,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站涯塔,受9級(jí)特大地震影響肌稻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匕荸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一爹谭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榛搔,春花似錦诺凡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至尔觉,卻和暖如春凉袱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侦铜。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工专甩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钉稍。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓涤躲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贡未。 傳聞我的和親對(duì)象是個(gè)殘疾皇子种樱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 引入 Redis對(duì)外提供了5種類型:字符串蒙袍、列表、集合缸托、有序集合以及哈希表左敌,但底層實(shí)現(xiàn)并不是固定的瘾蛋,以上五種數(shù)據(jù)結(jié)...
    宇宙最強(qiáng)架構(gòu)師閱讀 650評(píng)論 0 3
  • 本文為筆者對(duì)在學(xué)習(xí)Redis過程中所收集資料的一個(gè)總結(jié)俐镐,目的是為了以后方便回顧相關(guān)的知識(shí),大部分為非原創(chuàng)內(nèi)容。特此...
    EakonZhao閱讀 14,407評(píng)論 0 9
  • Redis是啥 Redis是一個(gè)開源的key-value存儲(chǔ)系統(tǒng)哺哼,由于擁有豐富的數(shù)據(jù)結(jié)構(gòu)佩抹,又被其作者戲稱為數(shù)據(jù)結(jié)構(gòu)...
    一凡呀閱讀 1,171評(píng)論 0 5
  • 有些人 他們赤腳在你生命中走過 眉眼帶笑 不短暫 也不漫長(zhǎng) 卻足以讓你體會(huì)幸福 領(lǐng)略痛楚 夠你回憶一生
    妃卿閱讀 133評(píng)論 0 5
  • 這世上不僅有「中二病」,還有「大二病」取董。它講的是啊棍苹,大學(xué)的莘莘學(xué)子們,在經(jīng)過了充滿新鮮感的第一年新生時(shí)期后茵汰,大二會(huì)...
    少女冉閱讀 112評(píng)論 1 4