第二章 簡單動態字串

2022-06-09 11:27:09 字數 1134 閱讀 7369

在redis中,預設字串的表示型別是sds(簡單動態字串),c語言傳統的字串表示只在很少的情況下用到。

sds結構:

char buf;用於儲存字串,會在字串結尾自動新增乙個空字元,遵循c字串結尾的慣例,即用n+1字串陣列表示長度為n的字串

unsigned int len;buf中已使用的長度,不包含自動新增的空字元(原生帶有的的空字元需要計算在內),int型別占用記憶體4byte

unsigned int free;記錄buf未使用的位元組數量,不包含自動新增的空字元,初始化為0。int型別占用記憶體為4byte

sds占用的記憶體為:4byte + 4byte + n + 1。其中n為儲存的字串長度

2.2.1 獲取字串長度複雜度為o(1)

因為len屬性,可以很快獲取字串長度不需要遍歷。

2.2.2 杜絕緩衝區溢位

在sds api對sds修改時,api 會預先檢查是否有足夠空間,否則會分配足夠的記憶體,再寫入。而c語言中的操作都假設分配的記憶體是足夠的,檢查和記憶體不足的工作都交由上層呼叫者處理。

2.2.3 減少修改字串時帶來的記憶體重分配次數

c字串的每次增長或縮短,都需要一次記憶體重分配:增長需要擴充套件可使用記憶體,否則出現緩衝區溢位;縮短需要釋放記憶體,否則出現記憶體洩漏。記憶體重分配比較耗時,頻繁的記憶體重分配操作不適用redis的使用場景。在redis中通過空間預分配和惰性空間釋放兩種策略優化。

1.空間預分配

擴充套件時,額外分配 min(擴充套件後總大小,1mb) 大小的記憶體用作緩衝。下次分配時,sds api 會預先檢查緩衝空間,如果夠用則直接分配。相對於c字串的n次擴充套件都需要n次重分配,sds將其降低為最多n次重分配。

2.惰性空間釋放

縮短時,移除不需要的位元組後,並不會立刻縮短分配記憶體,用free記錄當前可使用大小,目的是下次擴充套件時,需要使用這部分記憶體。

2.2.4 二進位制安全

2.2.5 相容部分c字串函式    

sds api依然自動在末尾新增空字元,是為了相容c字串函式,避免不必要的**重複。

第二章簡單動態字串

1.sds的定義 在redis中的字串並不是使用c語言中的char陣列儲存,而是自定義了乙個結構體sds來儲存。redis set msg hello world ok integer 3 在上述例子中,不管是key還是val都是使用sds型別儲存。free屬性的值為0,表示這個sds沒有分配任何未...

第二章 字元和字串處理

一 tchar c text a tchar szbuffer 100 text a string 無論使用ansi還是unicode字元,編譯器都能通過編譯。二 在使用winexec和openfile呼叫的地方,應該用createprocess和createfile呼叫來代替。三 應當遵循的基本準...

求職寶典 第二章 字串

1.字串與子串 子串行 字串是由零個或多個字元組成的有限序列,子串的定義是串中任意個連續的字元組成的子串行,並規定空串是任意串的子串,任意串是其自身的子串,2.c風格字串 c 語言通常通過 char const char 型別的指標來 c語言中的風格字串。一般來說,我們使用指標的算數操作符來遍歷 c...