redis數據結構的底層實現(上)

1、演示數據類型的實現

OBJECT ENCODING    key

該命令是用來顯示那五大數據類型的底層數據結構剪决。

比如對于 string 數據類型:
  


string11.png

我們可以看到實現string數據類型的數據結構有 embstr 以及 int。

再比如 list 數據類型:
  


string22.png

2、簡單動態(tài)字符串
  
  第一篇文章我們就說過 Redis 是用 C 語言寫的,但是對于Redis的字符串解幼,卻不是 C 語言中的字符串(即以空字符’\0’結尾的字符數組)闸拿,它是自己構建了一種名為 簡單動態(tài)字符串(simple dynamic string,SDS)的抽象類型,并將 SDS 作為 Redis的默認字符串表示书幕。
  
  SDS 定義:

struct sdshdr{
     //記錄buf數組中已使用字節(jié)的數量
     //等于 SDS 保存字符串的長度
     int len;
     //記錄 buf 數組中未使用字節(jié)的數量
     int free;
     //字節(jié)數組新荤,用于保存字符串
     char buf[];
}

用SDS保存字符串 “Redis”具體圖示如下:

SDS.png

我們看上面對于 SDS 數據類型的定義:

1、len 保存了SDS保存字符串的長度

2台汇、buf[] 數組用來保存字符串的每個元素

3苛骨、free j記錄了 buf 數組中未使用的字節(jié)數量
  
  C語言由于不記錄字符串的長度,所以如果要修改字符串苟呐,必須要重新分配內存(先釋放再申請)痒芝,因為如果沒有重新分配,字符串長度增大時會造成內存緩沖區(qū)溢出牵素,字符串長度減小時會造成內存泄露严衬。

而對于SDS,由于len屬性和free屬性的存在笆呆,對于修改字符串SDS實現了空間預分配和惰性空間釋放兩種策略:

1请琳、空間預分配:對字符串進行空間擴展的時候,擴展的內存比實際需要的多赠幕,這樣可以減少連續(xù)執(zhí)行字符串增長操作所需的內存重分配次數俄精。

2、惰性空間釋放:對字符串進行縮短操作時榕堰,程序不立即使用內存重新分配來回收縮短后多余的字節(jié)竖慧,而是使用 free 屬性將這些字節(jié)的數量記錄下來,等待后續(xù)使用逆屡。(當然SDS也提供了相應的API圾旨,當我們有需要時,也可以手動釋放這些未使用的空間魏蔗。)
  


C與SDS的區(qū)別.png

這次就先分享到這里砍的,更多干貨和資料請直接聯系我,也可以加群710520381沫勿,邀請碼:柳貓挨约,歡迎大家共同討論

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末味混,一起剝皮案震驚了整個濱河市产雹,隨后出現的幾起案子,更是在濱河造成了極大的恐慌翁锡,老刑警劉巖蔓挖,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異馆衔,居然都是意外死亡瘟判,警方通過查閱死者的電腦和手機怨绣,發(fā)現死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拷获,“玉大人篮撑,你說我怎么就攤上這事〈夜希” “怎么了赢笨?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驮吱。 經常有香客問我茧妒,道長,這世上最難降的妖魔是什么左冬? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任桐筏,我火速辦了婚禮,結果婚禮上拇砰,老公的妹妹穿的比我還像新娘梅忌。我一直安慰自己,他們只是感情好除破,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布铸鹰。 她就那樣靜靜地躺著,像睡著了一般皂岔。 火紅的嫁衣襯著肌膚如雪蹋笼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天躁垛,我揣著相機與錄音剖毯,去河邊找鬼。 笑死教馆,一個胖子當著我的面吹牛逊谋,可吹牛的內容都是我干的。 我是一名探鬼主播土铺,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼胶滋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悲敷?” 一聲冷哼從身側響起究恤,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎后德,沒想到半個月后部宿,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年理张,在試婚紗的時候發(fā)現自己被綠了赫蛇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡雾叭,死狀恐怖悟耘,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情织狐,我是刑警寧澤作煌,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站赚瘦,受9級特大地震影響粟誓,放射性物質發(fā)生泄漏。R本人自食惡果不足惜起意,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一鹰服、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揽咕,春花似錦悲酷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛹头,卻和暖如春顿肺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渣蜗。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工屠尊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耕拷。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓讼昆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骚烧。 傳聞我的和親對象是個殘疾皇子浸赫,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內容

  • 前言 Redis是目前最火爆的內存數據庫之一,通過在內存中讀寫數據赃绊,大大提高了讀寫速度既峡,可以說Redis是實現網站...
    小陳阿飛閱讀 803評論 0 1
  • Redis數據庫里面的每個鍵值對(key-value pair)都是由對象(object)組成的: 其中,數據庫鍵...
    one_zheng閱讀 553評論 0 0
  • Redis使用的是自己構建的簡單動態(tài)字符串(simple dynamic string凭戴,SDS)的抽象類型涧狮, 并將...
    但莫閱讀 505評論 0 0
  • 這個世界真靜 連自己的心跳聽得見 風對葉子說 隨我走 我可以帶你看 外面精彩的世界 葉子深情地望著樹 隨風走了……...
    韻芳閱讀 369評論 1 3
  • 繪制思路: 中心圖的美人魚,比較胖么夫,肚皮比較突出者冤,代表我的姓“杜” 最近比較火的電影 美人魚 首先可以想到星爺 然...
    文魁大腦杜星默閱讀 635評論 0 51