redis sds(簡單動態字串)詳解

2021-09-17 00:09:45 字數 1776 閱讀 5933

sds是****** dynamic string的縮寫,意為簡單動態字串。

定義為:

struct sdshdr ;
如圖:

len:4,表示這個陣列儲存的字串的長度是4。

free:4,表示這個陣列的未使用空間是4。

buf:是乙個字元陣列,前4個位元組儲存的是字元'l'、『u』、『o』、『l』,最後乙個位元組儲存的是字串結束標識『\0』。

sds遵循c字串以空字元結尾的慣例,儲存空字元的1位元組不計算在sds的len中,並且為空字元分配額外的1位元組空間,以及添  加空字元到字串末尾等操作,是由sds函式自動完成的。這樣遵循空字元結尾這一慣例的好處是,sds可以直接重用一部分c字串函式庫裡面的函式。

既然sds中儲存的也是字串,為什麼不直接使用字串,而還要封裝成乙個結構體呢?

sds的三點優勢:

c字串不記錄自身長度帶來的另一問題就是容易造成緩衝區溢位。而sds api需要對sds進行修改時,api會先檢查sds的空間是否滿足修改要求,如果不滿足的話,api會自動將sds的空間擴充套件至需要的大小,然後執行下面的動作。

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

由於c字串不記錄長度,所以對於乙個包含n個字元的c字串來說,這個字串的底層實現總是乙個n+1個字元長的陣列,所以每次增長或縮短乙個c字串,都要對這個陣列進行一次記憶體重分配。

而sds中,buf陣列的長度不一定是字元數量加一,陣列裡面可以包含未使用的位元組,通過free 屬性,實現了空間預分配和惰性空間釋放兩種優化策略。

空間預分配用於優化sds的字串增長操作:當sds的api 對乙個sds 進行修改,並且需要對sds進行空間擴充套件的時候,不僅會為sds 分配修改所必須的空間,還會為sds 分配額外的未使用空間。

其中,額外分配的未使用空間數量由以下公式決定:

a,如果對sds 進行修改後,sds的長度(len值)將小於1mb,那麼分配和len 同樣大小的未使用空間,這時sds 的len和free 的值相同。比如,進行修改後,sds 的len 將變成7位元組,那麼也會分配7位元組的未使用空間,sds 的buf陣列的實際長度將變成

7+ 7 + 1位元組(額外的1位元組儲存空字元)。

b,如果對sds 進行修改後,sds的長度(len值)將大於等於1mb,那麼分配1mb的未使用空間,即free的值是1mb。比如。如果修改後,sds 的len將變成30mb,那麼會分配1mb 的未使用空間,sds 的buf陣列的實際長度將變成30mb + 1mb + 1位元組(額外的1位元組儲存空字元)。

惰性空間釋放用於優化sds 的字串縮短操作:當sds的api 需要縮短sds 儲存的字串時,程式並不立即使用記憶體分配來**縮短後多出來的位元組,而是使用free 屬性將這些位元組數量記錄起來,等待將來使用。

a,c字串中的字元必須符合某種編碼(一般是ascii編碼),並且除了字串的末尾外,字串裡面不能有空字元。

b,sds 的api 都是二進位制安全的,所有的sds api都會以處理二進位制的方式來處理sds 存放在buf陣列裡的資料,不會對資料有限制。即redis 不是用這個陣列來儲存字元,而是用它來儲存一系列二進位制資料。因為sds 使用len屬性的值來而不是空字元來判斷字串是否結束。

Redis SDS(簡單動態字串)

4.二進位制安全 5.相容部分c字串函式 3.sds api redis是由c語言編寫的,其資料結構的形式為 a c字串的長度獲取複雜度為o n b sds長度複雜度僅為o 1 在字串拼接的時候,c字串不記錄字串長度,拼接時候不滿足要求,就造成字串溢位。與c字串不同,sds的空間分配策略完全杜絕了發...

簡單動態字串

主要的資料結構是 sds 動態字串 雙端鍊錶 字典 壓縮字典 整數集合 跳躍表 set msg hello world 鍵值對的鍵是乙個字串物件,物件底層的實現是乙個儲存著字串 msg 的sds 鍵值對的值是乙個字串物件,底層實現也是sds 所以說sds 動態字串 是其他物件實現的基礎。每個sds....

簡單動態字串 SDS

sds dynamic string,簡單動態字串 是 redis 底層所使用的字串表示。sds 在 redis 中的主要作用有以下兩個 實現字串物件 stringobject 在 redis 程式內部用作char 型別的替代品 redis 是乙個鍵值對資料庫 key value db 資料庫的值可...