Redis設(shè)計(jì)與實(shí)現(xiàn)——簡單動(dòng)態(tài)字符串(SDS)

Redis字符串簡介

在Redis中,字符串的存儲(chǔ)不是使用C語言傳統(tǒng)的字符串表示柄慰,而是使用一種名為簡單動(dòng)態(tài)字符串(simple dynamic string)的數(shù)據(jù)結(jié)構(gòu)表示踢械。

例如: 這一條指令

redis>SET msg "hello"
OK

鍵值對的鍵是一個(gè)字符串對象奸晴,底層實(shí)現(xiàn)是一個(gè)保存著“msg”的SDS
鍵值對的值是一個(gè)字符串對象贱枣,底層實(shí)現(xiàn)是一個(gè)保存著“hello”的SDS

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

image

SDS與C字符串區(qū)別

  • 字符串的結(jié)尾依然以空字符結(jié)尾监署,遵循了C字符串定義的慣例,為的是可以復(fù)用一部分C中函數(shù)庫的函數(shù)纽哥,即兼容部分C字符串函數(shù)钠乏,而不需要重新寫一套。
  • len的定義可以以O(shè)(1)的時(shí)間復(fù)雜度獲取字符串的長度,在傳統(tǒng)C的字符串中春塌,需要進(jìn)行全部遍歷才能獲取長度晓避。在大量使用STRLEN時(shí)SDS將大大提升效率。
  • free的定義可以杜絕緩沖區(qū)溢出只壳,例如:


    在這里插入圖片描述

    原來內(nèi)存中緊貼的兩個(gè)字符串俏拱,使用了這個(gè)命令。

strcat(s1,"Cluster");
在這里插入圖片描述

這樣就會(huì)導(dǎo)致s1的內(nèi)容溢出到了s2中吕世。而在SDS中則不會(huì)發(fā)生彰触,因?yàn)槊看芜M(jìn)行類似這種增加字符的操作,首先會(huì)判斷free的長度是否大于增加的字符命辖,如果小于况毅,則會(huì)重新開辟新的空間再進(jìn)行增加。

那開辟新的空間的長度與增加后的字符串長度相等的嗎尔艇?
不是尔许!為了減少修改字符串時(shí)帶來的內(nèi)存重分配,在SDS修改之后的長度(len長度)小于1MB時(shí)终娃,程序會(huì)多分配與len長度相同的空間味廊,即free的值與len值相等。反之棠耕,則多分配1MB的長度余佛。例如修改之后len的值為13字節(jié),那么程序會(huì)再分配13字節(jié)的未使用空間窍荧,總長度buf數(shù)組則為13+13+1=27字節(jié)(額外的一字節(jié)用來保存空字符)辉巡。若修改之后len的值為30MB,則buf數(shù)組為30MB+1MB+1Byte

  • 為了減少內(nèi)存重分配的次數(shù)蕊退,SDS采用的是惰性空間釋放郊楣,當(dāng)字符串縮短時(shí),程序不是立即回收縮短后多出來的字節(jié)瓤荔,而是使用free變量來記錄多出來的字節(jié)净蚤。如果擔(dān)心內(nèi)存浪費(fèi),SDS也提供了API可以在真正有需要時(shí)釋放SDS的未使用空間输硝。

二進(jìn)制安全

Redis作為數(shù)據(jù)庫存儲(chǔ)今瀑,需要滿足各種各樣的存儲(chǔ)形式,若使用傳統(tǒng)C字符串点把,遇到空字符便會(huì)結(jié)束橘荠,而SDS使用len的值來判斷字符串是否結(jié)束,所以程序在寫入數(shù)據(jù)時(shí)怎么樣愉粤,取出也是怎么樣砾医。

舉個(gè)例子:
在這里插入圖片描述

假如這種存儲(chǔ)形式以空字符來劃分字符,如用C字符串衣厘,讀了Redis后面的字符就讀不到了如蚜。

總結(jié)
在這里插入圖片描述

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市影暴,隨后出現(xiàn)的幾起案子错邦,更是在濱河造成了極大的恐慌,老刑警劉巖型宙,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撬呢,死亡現(xiàn)場離奇詭異,居然都是意外死亡妆兑,警方通過查閱死者的電腦和手機(jī)魂拦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門毛仪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芯勘,你說我怎么就攤上這事箱靴。” “怎么了荷愕?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵衡怀,是天一觀的道長。 經(jīng)常有香客問我安疗,道長抛杨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任荐类,我火速辦了婚禮怖现,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掉冶。我一直安慰自己真竖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布厌小。 她就那樣靜靜地躺著恢共,像睡著了一般。 火紅的嫁衣襯著肌膚如雪璧亚。 梳的紋絲不亂的頭發(fā)上讨韭,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音癣蟋,去河邊找鬼透硝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疯搅,可吹牛的內(nèi)容都是我干的濒生。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幔欧,長吁一口氣:“原來是場噩夢啊……” “哼罪治!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起礁蔗,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤觉义,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浴井,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晒骇,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洪囤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徒坡。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖箍鼓,靈堂內(nèi)的尸體忽然破棺而出崭参,到底是詐尸還是另有隱情呵曹,我是刑警寧澤款咖,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站奄喂,受9級特大地震影響铐殃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跨新,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一富腊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧域帐,春花似錦赘被、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龙优,卻和暖如春羊异,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彤断。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工野舶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宰衙。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓平道,卻偏偏與公主長得像,于是被迫代替她去往敵國和親供炼。 傳聞我的和親對象是個(gè)殘疾皇子一屋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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