Redis string之SDS源碼分析2

上一篇我們看了Redis里面關(guān)于新舊版本對(duì)于sds的不同的結(jié)構(gòu)體實(shí)現(xiàn),接下來(lái)看看sds.c中關(guān)于redis動(dòng)態(tài)字符串的具體操作。

從new開(kāi)始:

sdsnew函數(shù)是創(chuàng)建一個(gè)sds字符串的開(kāi)始函數(shù)。

image.png

實(shí)際的初始化邏輯在sdsnewlen中,不僅是sdsnew函數(shù),sdsempty、sdsup其實(shí)內(nèi)部調(diào)的都是sdsnewlen這個(gè)函數(shù)。

先看一下函數(shù)注釋的意思,就是說(shuō)使用給定的字符串長(zhǎng)度作為初始化值來(lái)創(chuàng)建一個(gè)sds動(dòng)態(tài)字符串,如果是Null的話,那就給0字節(jié),最后說(shuō)了下sds是二進(jìn)制安全的,我們可以放心的使用\0。

然后是代碼邏輯:

1、首先定義了一個(gè)void *sh ,這里為了進(jìn)一步提升性能不同長(zhǎng)度的字符串只能使用不同的結(jié)構(gòu)體,所以說(shuō)無(wú)法確切定義 例如:struct sdshdr *sh,這里宏里是寫(xiě)死的。然后聲明一個(gè)別名(這里的sds其實(shí)就是sdshdr中的buf的指針)

2、根據(jù)不同的長(zhǎng)度決定使用不同的結(jié)構(gòu)體,然后下面那一段是一個(gè)經(jīng)驗(yàn)寫(xiě)法為了放入超過(guò)32長(zhǎng)度的字符串

3、定義一個(gè)具體標(biāo)示具體結(jié)構(gòu)體的指針

4、剩下的都是根據(jù)不同的長(zhǎng)度分配對(duì)應(yīng)的結(jié)構(gòu)體,并且設(shè)置屬性了

image.png

這個(gè)函數(shù)沒(méi)有截完整,稍微有點(diǎn)長(zhǎng),后面的都是類(lèi)似的case 語(yǔ)句啦

除了創(chuàng)建新的字符串,然后就是追加字符串,追加字符串用的是sdscatlen 函數(shù) src/sds.c L:379

這個(gè)函數(shù)是用于截取指定字符串的指定長(zhǎng)度追加到原有字符串中的,sds s:原有串、const void *t:要追加到原有字符串后的值、len:要截取的待拷貝的值的長(zhǎng)度

先計(jì)算當(dāng)前字符串已經(jīng)使用的長(zhǎng)度,根據(jù)新長(zhǎng)度來(lái)衡量是進(jìn)行擴(kuò)容還是保持不變,直接進(jìn)行內(nèi)存拷貝而不是字符串拷貝,來(lái)保證二進(jìn)制兼容,最后設(shè)置新長(zhǎng)度就好了。

image.png

很顯然sdscatlen函數(shù)中沒(méi)有做什么很核心的事兒,真正比較關(guān)心其中使用的sdsMakeRoomFor 擴(kuò)容函數(shù)。下面來(lái)看一下這個(gè)函數(shù):src/sds.c L:197

當(dāng)出現(xiàn)現(xiàn)有可用空間無(wú)法滿足新串長(zhǎng)度時(shí)進(jìn)行擴(kuò)容

入?yún)ⅲ簊ds s:帶擴(kuò)容的sds字符串指針、size_t addlen:新串的長(zhǎng)度

出參:新的sds指針,如果沒(méi)發(fā)生擴(kuò)容和入?yún)⑹且恢碌?/p>

1、首先計(jì)算原sds還剩多少可分配空間,如果夠的話,直接返回(一直到第8行)

2、如果新長(zhǎng)度小于最大預(yù)分配長(zhǎng)度則擴(kuò)容為2倍,如果新長(zhǎng)度大于最大預(yù)分配長(zhǎng)度則僅追加SDS_MAX_PREALLOC長(zhǎng)度

3、如果是SDS_TYPE_5,則直接分配SDS_TYPE_8類(lèi)型

4、如果類(lèi)型沒(méi)有發(fā)生變化則重新開(kāi)辟一塊內(nèi)存將原先整個(gè)SDS拷貝一份過(guò)去即可

image.png

其他的另外幾個(gè)函數(shù)都是依賴于這幾個(gè)核心函數(shù)的,現(xiàn)在應(yīng)該對(duì)SDS有了更深一步的理解啦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容