標籤:style blog ar 使用 sp strong 資料 div on
redis的基本資料結構是動態數組
一、c語言動態數組
先看下一般的動態數組結構
struct MyData { int nLen; char data[0];};
這是個廣泛使用的常見技巧,常用來構成緩衝區。比起指標,用空數組有這樣的優勢:
1.不需要初始化,數組名直接就是所在的位移
2.不佔任何空間,指標需要佔用
int
長度空間,空數組不佔任何空間。
這個數組不佔用任何記憶體,意味著這樣的結構節省空間的;
該數組的記憶體位址就和他後面的元素的地址相同,意味著無需初始化,數組名就是後面元素的地址,直接就能當做指標使用。
這樣的寫法最適合製作動態buffer。因為可以這樣分配空間:
malloc(sizeof(struct XXX)+ buff_len);
看出來好處沒有?直接就把buffer的結構體和緩衝區一塊分配了。用起來也非常方便,因為現在空數組其實變成了buff_len長度的數組了。
這樣的好處是:
一次分配解決問題,省了不少麻煩。大家知道為了防止記憶體流失,如果是分兩次分配(結構體和緩衝區),那麼要是第二次malloc失敗了,必須復原釋放第一個分配的結構體。這樣帶來了編碼麻煩。
其次,分配了第二個緩衝區以後,如果結構裡面用的是指標,還要為這個指標賦值。同樣,在free這個buffer的時候,用指標也要兩次free。如果用空數組,所有問題一次解決。
其次,大家知道小記憶體的管理是非常困難的,如果用指標,這個buffer的struct部分就是小記憶體了,在系統記憶體在多了勢必嚴重影響記憶體管理的效能。要是用空數組把struct和實際資料緩衝區一次分配大塊問題,就沒有這個問題。
如此看來,用空數組既簡化編碼,又解決了小記憶體片段問題提高了效能,何樂不為?應該廣泛採用。
二、Redis資料類型定義
sds(Simple Dynamic Strings)是 Redis中最基本的底層資料結構, 它既是 Redis 的 String 類型的底層實現, 也是實現 Hash 、 List 和 Set 等複合類型的基石。
除此之外,sds 還是 Redis 內部實現所使用的字串類型,
//與 sds 實現有關的資料類型有兩個,一個是 sds :// 字串類型的別名 typedef char *sds;//另一個是 sdshdr :// 持有 sds 的結構 struct sdshdr { int len; // buf 中已被使用的字串空間數量 int free; // buf 中預留字串空間數量 char buf[]; // 實際儲存字串的地方 };
sds.c中有很多函數對sdshdr結構體的處理,這裡就不多說明了,具體看代碼
但是其中sds有空間預分配策略和惰性空間釋放 兩個最佳化策略
1)空間預分配策略
主要是針對分配空間時,預留一部分空間。小於1Mz那麼程式分配和預留空間同樣大小。
2)惰性空間釋放
主要針對截斷字串時候,並不釋放空間,而是把截斷的位置賦值為‘\0‘
這裡可以看看《Redis設計與實現》 裡面有對源碼分析,看源碼配合著書一起看 還是很容易理解的
redis 學習筆記二 (簡單動態字串)