redis的動態字串SDS

2021-10-24 03:32:58 字數 887 閱讀 6476

redis雖然是用c來實現的,但是他的字元型別並沒有完全採用c的型別,c字串只是字串字面量,只有在用一些不需要變化的字串時才會採用c字串。比如列印日誌,而在使用需要變化的時候使用sds,比如當鍵值對的值是字串時。還被用作緩衝區

至於為什麼這樣做,則是考慮到了redis的應用場景,redis一般被用作快取,和處理需要快速完成的業務,這個時候雖然c字串很優秀,但是c字串的格式是字串加空字元的結構,每次拼接都要重新分配記憶體,而且還有記憶體溢位的危險。

sds的結構

sdshdr

free預留空間

len字元長度

buf實際的字元儲存

分配記憶體空間的演算法是很複雜的,因為sds有預留的記憶體free,所以他並不是每次拼接都會分配記憶體空間,大大減少了分配記憶體所用的時間,像是c字串,如果忘記了分配記憶體就會有記憶體溢位的問題,但是sds是預設的分配預留記憶體,所以不會有記憶體溢位的問題,sds每次拼接時都會先判斷預留的空間是否夠這次拼接,不夠的時候才會重新分配記憶體空間,每次拼接都會將len的長度累加。

當字元的長度不滿1mb時,預留空間可存字元的長度和len的長度是一致的,當字元的長度超過1mb時,預留空間的長度固定為1mb。因為每次憑藉都會判斷預留空間,所以不會有記憶體溢位的問題,因為有了預留空間,大大減少了記憶體分配的次數。

當字串做刪除操作時,不會立刻使用重分配,而是將空出來的空間存到free中。

又因為sds結構中有len,所以c語言中的複雜度為o(n)的獲取字串長度的方法被縮減為了sds的o(1),也就是直接獲取len的大小來獲得長度。

sds字串是二進位制安全的,可以儲存任意型別的資料,他會儲存資料代表的二進位制資料,所以不會像c字串一樣遇見空格就結束,他用len的值來判斷結束。

但是sds也會遵循c字串以空格結尾的設定,這是為了在特定場合下使用一些c的函式。

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

Redis學習筆記 簡單動態字串SDS

引言 redis在我日常工作中使用的頻率相當高,每個專案基本都會用到。在redis的使用過程中,字串使用的頻率也是相當的高,所以有必要學習redis的字串的相關知識。文中涉及的 為redis3.0版本 簡單了解sds dynamic string 簡單動態字串 redis使用sds進行字串的表示,沒...