redis 學習筆記二 簡單動態字串

2021-08-01 13:18:18 字數 2032 閱讀 2368

一、c語言動態陣列

先看下一般的動態陣列結構1

2

3

4

5

structmydata

;

這是個廣泛使用的常見技巧,常用來構成緩衝區。比起指標,用空陣列有這樣的優勢:  

1.不需要初始化,陣列名直接就是所在的偏移

2.不佔任何空間,指標需要占用int長度空間,空陣列不佔任何空間。

這個陣列不占用任何記憶體,意味著這樣的結構節省空間;

該陣列的記憶體位址就和他後面的元素的位址相同,意味著無需初始化,陣列名就是後面元素的位址,直接就能當做指標使用。

這樣的寫法最適合製作動態buffer。因為可以這樣分配空間:  

malloc(sizeof(struct  ***)+  buff_len);  

看出來好處沒有?直接就把buffer的結構體和緩衝區一塊分配了。用起來也非常方便,因為現在空陣列其實變成了buff_len長度的陣列了。  

這樣的好處是:  

一次分配解決問題,省了不少麻煩。大家知道為了防止記憶體洩漏,如果是分兩次分配(結構體和緩衝區),那麼要是第二次malloc失敗了,必須回滾釋放第乙個分配的結構體。這樣帶來了編碼麻煩。

其次,分配了第二個緩衝區以後,如果結構裡面用的是指標,還要為這個指標賦值。同樣,在free這個buffer的時候,用指標也要兩次free。如果用空陣列,所有問題一次解決。  

其次,大家知道小記憶體的管理是非常困難的,如果用指標,這個buffer的struct部分就是小記憶體了,在系統內存在多了勢必嚴重影響記憶體管理的效能。要是用空陣列把struct和實際資料緩衝區一次分配大塊問題,就沒有這個問題。  

如此看來,用空陣列既簡化編碼,又解決了小記憶體碎片問題提高了效能,何樂不為?應該廣泛採用。  

二、redis資料型別定義

sds(****** dynamic strings)是 redis中最基本的底層資料結構, 它既是 redis 的 string 型別的底層實現, 也是實現 hash 、 list 和 set 等復合型別的基石。

除此之外,sds 還是 redis 內部實現所使用的字串型別, 

1

2

3

4

5

6

7

8

9

10

11

12

13

//與 sds 實現有關的資料型別有兩個,乙個是 sds :

// 字串型別的別名

typedefchar*sds;

//另乙個是 sdshdr :

// 持有 sds 的結構

structsdshdr

;

sds.c中有很多函式對sdshdr結構體的處理,這裡就不多說明了,具體看**

但是其中sds有空間預分配策略和惰性空間釋放  兩個優化策略

1)空間預分配策略

主要是針對分配空間時,預留一部分空間。小於1mz那麼程式分配和預留空間同樣大小。

2)惰性空間釋放

主要針對截斷字串時候,並不釋放空間,而是把截斷的位置賦值為'\0'

這裡可以看看《redis設計與實現》   裡面有對原始碼分析,看原始碼配合著書一起看  還是很容易理解的

Redis設計與實現 筆記 第二章 簡單動態字串

redis使用自定義字串來替代c語言傳統的字串,struct sdshdr 可以使用 printf s s buff 來輸出通常 c 語言長度會使用 strlen 來進行長度的計算,其原理為從開始指標往後尋找 0 字元來確定長度,複雜度是 o n 實際上是進行了遍歷,而redis使用的結構,其記錄了...

Redis原始碼分析二 Redis簡單動態字串

redis簡單動態字串 redis沒有直接使用c語言傳統的字串表示 以空字元結尾的字元陣列,以下簡稱c字串 而是自己構建了一種名為簡單動態字串 dynamic string,sds 的抽象型別,並將sds用作redis的預設字串表示。在redis裡面,c字串只會作為字串字面量 string lite...

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

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