Redis源代碼分析之sds, 動態數組

Redis是用C語言編寫的。C語言處理字符串一貫是個難點。很容易出現內存越界問題。nginx

其它高級語言很容易實現的字符串拼接,在C這裏倒是百般艱難。由於須要實現計算出字符串所佔內存的大小。即不能過大(浪費內存),也不能過小(越界)。甚至在某個用C語言實現的項目中出現了這樣的代碼redis

 

 即,先計算出字符串的大小。而後申請內存,再拼接字符串。函數

這樣的操做幾乎是沒法忍受的。特別是當咱們的字符串構成比較複雜,或者字符串常常須要發生變動時。3d

 

redis的解決方案是使用了一個結構體,一組操做函數,將這個複雜的操做包裝起來。blog

 

這樣的字符串操做中,再也不出現字符串計算。再也不出現動態內存分配。全部的這些操做都被包含在sds的操做函數中。內存

Redis實際上是定義了一個結構體:字符串

而且sds爲了兼容C緣由的char* . 內容依然是以\0爲結尾。這點和nginx的ngx_string不太同樣。string

 

做爲strlen的替代品,sds也提供了sdslen效率

原來的strlen的時間複雜度是O(n),  而sdslen的時間複雜度是O(1)im

 

sds的內存擴容,當內存佔用小於1M時,它每次都會擴大爲原來的兩倍。這樣平攤下來擴容的時間複雜度也爲O(1)。也是效率很是高的

當內存佔用已超過1M時,它每次只會增加1M,而再也不是原來的兩倍。能夠略省內存。

相關文章
相關標籤/搜索