redis字串並沒有使用以空字元為結尾的字元陣列來構建,而是實現了一套自身的字串模式,也叫簡單動態字串(sds,****** dynamic string).
sds在sds.h/sdshdr中如下表示
sds遵循c字串的已空字元結尾的慣例,這樣sds便可以復用c字串函式庫的一些函式.無須為sds編寫已經存在的功能函式.比如列印輸出等.struct sdshdr
sds特點:
* 獲取字串長度的時間複雜度降為o(1),通過len屬性直接讀取
* 杜絕緩衝區溢位,每次修改字串時sds api會檢測是否分配了足夠空間
* 減少字串修改時記憶體分配的次數
sds通過未使用空間解除了字串長度和底層陣列長度之間的關聯,實現了空間預分配和惰性空間釋放兩種優化策略
空間預分配策略:
優化sds字串增長的操作,增加長度時sds api不但會分配修改所必須的空間,還會分配額外的未使用空間.
1 修改後長度小於1mb,那麼未使用空間和必須空間分配同等大小.
2 修改後長度大於 1mb,會分配1mb的未使用空間
3 無論1還是2 ,char 長度均會另外儲存乙個字元記錄空字元
惰性空間釋放
減小字串長度時,並不會立即**記憶體而是將減小的記憶體數量累加到未使用空間free屬性上,下一次對字串操作時 api會先判斷未使用空間free是否滿足大小,如果滿足就使用未使用空間
總結一下c字串和sds的區別
c字串sds
獲取字串長度複雜度o(n)
獲取字串長度複雜度o(1)
api不安全會溢位
api安全,不會溢位
只能儲存文字
可以儲存文字或者二進位制資料
修改字串最多可分配n次空間
修改字串至多n次
可使用c字串函式
沿用部分了c字串函式
《redis設計與實現》讀書筆記
sds dynamic string 比起 c 字串,sds 具有以下優點 len屬性維護字串長度,常數複雜度即可獲取。預先檢查長度是否滿足需求,如果不滿足自動拓展,杜絕緩衝區溢位。空間預分配 惰性空間釋放會減少修改字串長度時所需的記憶體重分配次數。二進位制安全。相容部分 c 字串函式。list 鍊...
Redis設計與實現讀書筆記(二) 鍊錶
鍊錶作為最基礎的資料結構,在許多高階語言上已經有了很好的實現。由於redis採用c語言編寫,需要自己實現鍊錶,於是redis在adlist.h定義了鍊錶型別。作者對於這部分沒什麼好說,原始碼比較簡單,如果這方面沒有接觸過的話,作者也耐心地推薦了幾本書供參考。為了提高效率,這裡的鍊錶指的是雙向鍊錶,使...
redis設計與實現 讀書筆記1
乙個業務模型引出對redis的好奇 提出問題 1.redis 的五種資料型別分別由什麼資料結構實現?2.redis 的字串型別既可以儲存字串,也可以儲存整數和浮點數,甚至是二進位制位 使用setbit redis 內部是如何實現儲存這些值?3.redis的一部分命令只能對特定的資料型別執行 而另一部...