Redis 簡單動態字串

2021-09-12 10:38:41 字數 860 閱讀 2426

在c語言中,乙個結構體中最後乙個成員的位址減去第乙個成員的位址,就是該結構體的大小

例如:

struct sdshdr ;
buf的位址減去len的位址,正好等於sizeof(sdshdr);

在c++中 char * str = "nihao"是不被允許的,但是c語言中可以,並且可以直接列印str 輸出nihao,和c++中 char str = 」nihao「;一樣的效果,自動在末尾加上了'\0'

將字串的首字元變成'\0',可以惰性的清空該字串。輸出該字串的時候,是空字串,但實際上這一塊記憶體並沒有被清理。

sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
類似這樣申請記憶體的做法,由於char buf是結構體最後乙個元素,+initlen+1,相當給buf申請了乙個長度為initlen的空間,末尾的+1是存放'\0'的

2.空間預分配

記憶體重分配涉及複雜的演算法,並且可能需要執行系統呼叫,所以它通常是乙個比較耗時的操作。

sds進行空間擴充套件的適合,程式不僅會為sds分配修改所必須要的空間,還會為sds分配額外的未使用的空間。其中,額外分配的未使用空間數量由以下公式決定:

如果對sds進行修改知乎,sds的長度小於1mb,那麼程式分配和len屬性同樣大小的未使用空間,這時sds的len屬性的值將和free屬性的值相同。

如果對sds進行修改知乎,sds的長度大於1mb,那麼程式會分配1mb的未使用空間,例如進行修改後,sds的len變成30mb,那麼程式會分配1mb的未使用空間(free)

3.二進位制安全

sds使用len來記錄字串的長度可以避免傳統c字串以空白字元結尾造成的不安全。

redis簡單動態字串

redis內部使用sds,簡單動態字串,sds是什麼 dynamic t包含字串長度,空間使用率,已使用,未使用等資訊的乙個結構體 sds比c語言字串的優點 獲取字串長度不需要進行遍歷,時間複雜度為o 1 杜絕緩衝區溢位 對sds進行修改的時候,api會先檢查sds的空間是否足夠,如果不需要的話,a...

redis 簡單動態字串

redis沒有直接使用c語言傳統的字串表示,而是自己構建了一種名為簡單動態字串 sds 的抽象型別,並將其作為redis的預設字串表示,即redis中包含字串值的鍵值對在底層都是由sds實現的。每個sds.h sdshdr結構表示乙個sds的值,如下所示 sds遵循c字串以空字元結尾的管理,儲存空字...

Redis之簡單動態字串

sds的介紹 redis中字串並沒有使用c語言傳統的字串,而是構建了一種名為簡單動態字串 sds sds是redis的預設字串標識。redis裡面的c語言字串用在一些無需對字串值進行修改的地方,例如列印日誌redislog redis warning,redis is now ready to ex...