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...