【Redis設計與實現】第2章 簡單動態字符串

簡單動態字符串

    Redis並不直接使用C語言字符串,而是本身構建一套簡單動態字符串(simple dynamic string ,SDS)C字符串僅僅在一些無需對字符串進行修改的地方使用,例如打印日誌。SDS除了用來保存數據庫裏面的字符串,還被用作緩衝區,AOF緩衝區,客戶端狀態中的輸入緩衝區,都使用了SDS。redis

2.1 SDS的定義

2.2 SDS與C字符串的區別

2.2.1 常數複雜度獲取字符串長度

    C語言字符串獲取長度 須要遍歷整個字符串 時間複雜度爲O(n) 而SDS爲O(1)算法

2.2.2 杜絕緩衝區溢出

    由於C語言字符串並不保存字符串的長度,若是在執行strcat(char *dest,const char *src)的時候,若是沒有給dest分配足夠多的內存的話,頗有可能就會形成緩衝區溢出。而SDS的空間分配策略杜絕了緩衝區溢出的可能性,由於SDS API會先檢查空閒空間是否知足修改的需求,不知足的話,會擴容以知足空間須要。數據庫

2.2.3 減小內存重分配次數

    對於C語言字符串的擴容和縮容,頻繁的內存申請和空間釋放,由於內存的申請涉及到比較複雜的分配算法,還須要執行一些比較耗時的系統調用安全

而 SDS則實現了 空間預分配 惰性空間釋放函數

空間預分配spa

惰性空間釋放3d

2.2.4 二進制安全

C語言字符串以\0做爲結束符,只能保存文本數據,不能保存圖片、視頻等二進制數據,爲了保證redis適用於各類業務場景,因此SDS都是二進制安全的(binary-safe) , 由於SDS使用length判斷字符串是否結束,因此不存在那樣的問題。日誌

2.2.5 兼容部分C字符函數

2.2.6 總結

2.3 重點回顧

相關文章
相關標籤/搜索