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

1.簡單動態(tài)字符串

每個sds.h/sdshdr結(jié)構(gòu)表示一個SDS值,Redis是C語言寫的。

image.png

與C字符串的區(qū)別:

  • 常數(shù)復(fù)雜度獲取字符串長度

  • 杜絕緩沖區(qū)溢出

C字符串不記錄長度勺三,如果兩個C字符串前后緊挨在一起,這時候擴展前字符串時,后字符串就會被覆蓋。

  • 減少修改字符串時內(nèi)存重分配的次數(shù)

結(jié)構(gòu)體的free狰闪,就是處理分配的空間大小,如果你要擴展的話濒生,可以探索是否有足夠空間埋泵,夠的話直接修改free,不夠再重分配罪治,縮短一定不用重分配了丽声,直接縮短就行了。

  • 二進制安全

  • 兼容部分C字符串函數(shù)

2.鏈表

鏈表廣泛運用與Redis的各個功能觉义,例如:列表鍵雁社、發(fā)布與訂閱、慢查詢晒骇、監(jiān)視器等霉撵。

image (1).png

3.字典

(1) 結(jié)構(gòu)體

字典所使用的的哈希表結(jié)構(gòu):

image (2).png

我們存進去的hash鍵值對是哈希表的節(jié)點

image (1).png

字典的結(jié)構(gòu)體:

d64ecd6c-f2f3-46ec-96b0-a16542c9b0e1.png

整個關(guān)系是:字典>哈希表>鍵值對

(2)存入過程

  • 先計算鍵值對的哈希值滋饲,根據(jù)哈希值模哈希表的節(jié)點數(shù),得出鍵值對存入哪個節(jié)點中喊巍。解決哈希沖突的方法是拉鏈法

  • 當(dāng)鍵值對越來越多的時候,為了維持負載因子在一定量箍鼓,會進行rehash操作崭参。rehash過程采用的是漸進式rehash

4.跳躍表

  • 一種有序數(shù)據(jù)結(jié)構(gòu),它通過在每個節(jié)點中維持多個指向其他結(jié)點的指針款咖,從而達到快速訪問節(jié)點的目的何暮。

  • 跳躍表支持平均Ologn,最壞On復(fù)雜度的查找復(fù)雜度铐殃,跳表實現(xiàn)比平衡二叉樹簡單海洼。

  • 跳表只在有序集合鍵使用到了

(1)跳表的實現(xiàn)

f82d6ecc-593f-4588-909a-783fe7474dc2.png

跳表用了兩個結(jié)構(gòu)體定義穆役,相對復(fù)雜的是節(jié)點的結(jié)構(gòu)體定義匕坯。

跳躍表節(jié)點

3c0bcfbb-442c-4f39-bed9-829f8802760b.png
  • 每個節(jié)點都有一個數(shù)組常摧,我們稱作層样悟,每一層都可以直接指向其他節(jié)點劲适,只要層越多碾篡,訪問節(jié)點速度越快铡羡。

  • 每層都有一個前進指針拭嫁,還有個跨度民假,前進指針用來指向下一個節(jié)點浮入,跨度記錄前進指針跨了幾個節(jié)點。

5.整數(shù)集合

數(shù)據(jù)結(jié)構(gòu)如圖:

2f76af1a-e7cd-4ed7-8aa3-679b7aaa2476.png
  • 整數(shù)集合是個集合羊异,所以不會有重復(fù)值事秀,只存放整數(shù)int8、int32野舶、int64易迹;

  • 整數(shù)集合底層實現(xiàn)是個數(shù)組contents,而且排好序的

  • contents的類型不是int8平道,真正的類型是由encoding的值決定的赴蝇。

升級與降級

升級過程:

1)根據(jù)新元素的類型,擴展數(shù)組底層的空間大小巢掺,并為新元素分配空間句伶;

2)將底層數(shù)組的所有元素換成對應(yīng)的類型,并保證有序性的情況下放在正確的位置上陆淀;

3)將新元素放入底層數(shù)組中考余;

升級的好處:

  • 提升靈活性

  • 節(jié)約內(nèi)存

降級:整數(shù)集合不支持降級操作,一旦升級就不會降級轧苫。

6.壓縮列表

  • 壓縮列表是列表鍵與哈希鍵的底層實現(xiàn)之一楚堤;

  • 壓縮列表的結(jié)構(gòu)包括:zlbytes疫蔓、zltail、zllen身冬、entrys衅胀;其中entrys是個列表,zlbyte表示整個壓縮列表的大小酥筝,zltail是從壓縮列表首地址到最后一個entry的地址偏移量滚躯;

  • entry由previous_entry_length、encoding嘿歌、content組成掸掏,其中:

    • previous_entry_length保存上一個entry的長度,大小有1字節(jié)或者5字節(jié)宙帝,可用這個值來計算上一個節(jié)點的首地址
  • encoding記錄了content的類型以及長度

  • 連鎖更新:我們往一個壓縮列表的首節(jié)點插入一個大于254字節(jié)的節(jié)點丧凤,這時,后面的那個節(jié)點的previous_entry_length就要從1字節(jié)編程5字節(jié)步脓,這時就需要重分配內(nèi)存愿待,而重分配后,該節(jié)點后一個結(jié)點的previous_entry_length也要從1字節(jié)變成5字節(jié)靴患,會導(dǎo)致連鎖更新呼盆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚁廓,隨后出現(xiàn)的幾起案子访圃,更是在濱河造成了極大的恐慌,老刑警劉巖相嵌,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腿时,死亡現(xiàn)場離奇詭異,居然都是意外死亡饭宾,警方通過查閱死者的電腦和手機批糟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來看铆,“玉大人徽鼎,你說我怎么就攤上這事〉耄” “怎么了否淤?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棠隐。 經(jīng)常有香客問我石抡,道長,這世上最難降的妖魔是什么助泽? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任啰扛,我火速辦了婚禮嚎京,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隐解。我一直安慰自己鞍帝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布煞茫。 她就那樣靜靜地躺著帕涌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溜嗜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天架谎,我揣著相機與錄音炸宵,去河邊找鬼。 笑死谷扣,一個胖子當(dāng)著我的面吹牛土全,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播会涎,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼裹匙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了末秃?” 一聲冷哼從身側(cè)響起概页,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎练慕,沒想到半個月后惰匙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铃将,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年项鬼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲阎。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡绘盟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悯仙,到底是詐尸還是另有隱情龄毡,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布锡垄,位于F島的核電站稚虎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏偎捎。R本人自食惡果不足惜蠢终,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一序攘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寻拂,春花似錦程奠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慌核,卻和暖如春距境,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垮卓。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工垫桂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粟按。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓诬滩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灭将。 傳聞我的和親對象是個殘疾皇子疼鸟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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