redis設計與實現讀書筆記二 SDS

2021-08-17 14:56:35 字數 1133 閱讀 6379

redis字串並沒有使用以空字元為結尾的字元陣列來構建,而是實現了一套自身的字串模式,也叫簡單動態字串(sds,****** dynamic string).

sds在sds.h/sdshdr中如下表示

struct sdshdr
sds遵循c字串的已空字元結尾的慣例,這樣sds便可以復用c字串函式庫的一些函式.無須為sds編寫已經存在的功能函式.比如列印輸出等.

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的一部分命令只能對特定的資料型別執行 而另一部...