sds在redis的應用場景
1、用來儲存資料的字串值
2、被用做緩衝區,如aof模組的aof緩衝區,客戶端輸入的緩衝區
sds的定義
// sds.h/sdshdr結構表示的sds值:
struct sdshdr
sds示例如下圖:
sds相比與c字串的區別
1、獲取c字串長度,程式需遍歷整個字串,操作複雜度為o(n), 而sds的在len屬性中記錄sds本身的長度,獲取sds字串的長度複雜度僅為o(1)。
2、sds字串可以杜絕緩衝區溢位。這是因為sds api對sds進行修改時,api會先簡稱sds的空間是否滿足所需修改的要求,若不滿足,會自動將sds擴充套件所需的大小,然後再執行修改操作。
3、減少字串修改帶來的記憶體重分配次數。sds通過未使用空間解除了字串長度和底層陣列長度的關聯:在sds中,buf陣列長度不一定是字串加一, 陣列裡面可以包含未使用的位元組,而這些位元組的數量有sds的free屬性記錄。
通過未使用空間,sds實現了空間預分配和惰性空間釋放兩種優化策略。
1)空間預分配
sds對空間進行擴充套件時,程式不僅為sds分配修改,還會為sds分配額外未使用的空間。分配未使用空間數量的公式如下:
若sds的長度(len屬性的值)小於1m,程式分配和len屬性同樣大小的未使用空間,此時len的值和free屬性的值相同。2)惰性空間釋放若sds修改後,sds的長度大於1m,那麼程式將會分配1m未使用空間
在擴充套件sds空間之前,sds api會先檢查未使用空間是否足夠,如果足夠,api會直接使用未使用空間,而無需執行記憶體重分配。通過這種預分配策略,sds將連續增長n次字串所需的記憶體分配次數從必定n次降低為最多n次。
惰性空間釋放用於優化sds字串縮短操作。當sds api需要縮短sds儲存的字串,程式並不使用記憶體重分配來**縮短後多出來的位元組,而是使用free屬性,將這些位元組記錄下來,方便將來在用。
Redis 簡單動態字串
在c語言中,乙個結構體中最後乙個成員的位址減去第乙個成員的位址,就是該結構體的大小 例如 struct sdshdr buf的位址減去len的位址,正好等於sizeof sdshdr 在c 中 char str nihao 是不被允許的,但是c語言中可以,並且可以直接列印str 輸出nihao,和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字串以空字元結尾的管理,儲存空字...