Redis之簡單動態字串

2021-07-31 08:21:13 字數 1741 閱讀 1423

sds的介紹

redis中字串並沒有使用c語言傳統的字串,而是構建了一種名為簡單動態字串(sds),sds是redis的預設字串標識。

redis裡面的c語言字串用在一些無需對字串值進行修改的地方,例如列印日誌redislog(redis_warning,"redis is now ready to exit");

當redis需要的是可以被修改的字串值時,使用sds來表示字串值

redis> set msg "hello word"

//msg作為key,sds

//hello word 作為value ,sds

sds的定義
struct sdshdr

//buf中儲存著字串值,以 \0結尾 ,但是 len中不包含\0

//例如儲存字串reids 則 len長度為5

sds可以直接重用一部分c字串函式庫裡面的函式,

//獲取sds的指標s

printf("%s",s->buf);

sds與c字串的區別

c語言使用的這種簡單的字串表示方式,並不能滿足redis對字串在安全性、效率以及功能方面的要求,因此,sds比c字串更適用於redis。

1.常數複雜的獲取字串的長度

(直接通過len來獲取時間複雜度為o(1),然而c中要迴圈時間複雜度為(o(n)))

2.杜絕緩衝區溢位

char *strcat(char *dest,const

char *src);

//dest的空間大小並不知道,src長度可能過大,造成dest原本空間位址相連線的外部覆蓋

//,造成內容被意外修改,

sds會先檢查是否滿足修改所需的要求,如果不滿足,則空間擴充套件至所需大小,然後再執行修改操作。

sds的空間擴充套件策略,減少修改字串時帶來的記憶體重分配次數

(sds實現了空間預分配和惰性空間釋放兩種優化策略)

(1)空間預分配

-在對sds修改是,不僅對sds分配修改所必須要的空間,還會增加額外未使用空間

當長度(len)小於1mb時,len長度和free長度是相同的

(buf實際長度 = len + free + 1(\0) len == free)

當長度(len)大於等於1mb是,程式會分配1mb的未使用空間

(buf實際長度 = 30mb + 1mb + 1byte)

(2)惰性空間釋放

當sds縮短sds儲存的字串時,程式不會立即重分配來**縮短後多出來的位元組,而是使用free屬性將這些數量記錄起來,並等待將來的使用。

sds的buf屬性成為位元組陣列的原因是:

redis不是用這個陣列來儲存字元,而是用它來儲存一系列二進位制資料。

sds使用len屬性的值而不是空字元來判斷字串是否結束!

c字串和sds之間的區別

c字串

sds獲取字串長度的複雜度為o(n)

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

api是不安全的,可能造成緩衝區溢位

api是安全的

修改字串長度n次,必然要執行n次記憶體重分配

修改字元長度n次,對多執行n次記憶體重分配

只能儲存文字資料

可以儲存文字或者二進位制資料

可使用庫中的函式

可使用一部分庫中的函式

Redis深入之簡單動態字串

一 redis鍵值對 redis資料庫裡面的每個鍵值對 key value 都是由物件組成的,鍵是乙個字串物件,值是字串物件,列表物件,雜湊物件,集合物件,有序集合物件中的五種之一。redis沒有直接使用c語言傳統的字串表示,而是自己構建了乙個名為簡單動態字串sds的抽象型別,並將sds用作redi...

Redis之簡單動態字串 SDS

簡單動態字串sds dynamic string sds資料結構如下 struct sdshdr基於sds資料結構的定義和一些api規則,sds相比於c字串有如下優勢 1.獲取字串長度的複雜度為o 1 c字串的複雜度為o n 2.杜絕緩衝區溢位 3.減少修改字串時帶來的記憶體重分配次數 4.二進位制...

Redis之簡單動態字串(SDS)

redis沒有直接使用c語言傳統的字串表示,而是自己構建一種名為簡單動態字串 sds 的抽象型別,並將sds用作redis的預設字串表示。在redis的資料庫中,包含字串值得鍵值對在底層都是又sds實現的。比如reids set msg hello world ok在客戶端中執行這樣的命令,redi...