不瘦原來對redis也是有個大概的瞭解(就你知道的多), 可是最近和大神聊天的過程當中才明白本身知道的簡直就是雞毛蒜皮(讓你得瑟),因此不瘦打算從頭在捋一遍,順便把過程也記錄下來,若是能給你們在學習redis的道路上提供一條清晰的線索,不瘦胖也瞑目了.redis
咱們知道redis沒有直接使用C語言中的字符串,而是定義了簡單動態字符串(simple dynamic string,SDS)的抽象類型, 並將 SDS 用做 Redis 的默認字符串表示。其中SDS數據結構以下:數據庫
struct sdshdr { int len; // len表示buf中存儲的字符串的長度 int free; // free表示buf中空閒空間的長度 char buf[]; // buf用於存儲字符串內容
};
能夠看到,就是將一個字符數組和兩個整型變量封裝在結構體中,可是這一封裝加上一些看似簡單的方法(大道至簡)就爲SDS增長了不少特性:數組
和C語言字符串只能某種編碼(如ASCII),而且出結尾不能有'\0'字符相比,SDS也能夠存儲像圖片,音頻,視頻這樣的二進制數據安全
由於在SDS結構體中存儲了len,計算長度時直接返回便可(以空間換時間),而C語言要計算字符串長度時間複雜度爲O(n)數據結構
咱們知道在C語言拼接字符串時,若是超出原字符串申請的內存大小就會致使緩衝區溢出,而SDS的空間分配策略直接避免了溢出的可能性:當對SDS修改時,會先檢查剩餘空間是否 知足(free變量的做用),若是不知足,則進行自動擴容.性能
redis做爲數據庫常常被用於速度要求嚴苛、數據被頻繁修改的場合, 若是每次修改長度都須要執行一次內存重分配的話, 那麼光是執行內存重分配的時間就會佔去修改所用時間的 一大部分, 若是這種修改頻繁地發生的話, 可能還會對性能形成影響。學習
爲了應對這種應用場景,redis採起了兩種策略: 增長長度時空間預分配(每次多申請點),減小長度時空間惰性釋放(只改free的大小,不實際釋放空間)編碼
注意事項:設計
參考:視頻
《Redis設計與實現》
這裏是老瘦家的兒子,如需轉載請聲明,我替老瘦感謝你。