Redis並不直接使用C語言字符串,而是本身構建一套簡單動態字符串(simple dynamic string ,SDS)C字符串僅僅在一些無需對字符串進行修改的地方使用,例如打印日誌。SDS除了用來保存數據庫裏面的字符串,還被用作緩衝區,AOF緩衝區,客戶端狀態中的輸入緩衝區,都使用了SDS。redis
C語言字符串獲取長度 須要遍歷整個字符串 時間複雜度爲O(n) 而SDS爲O(1)算法
由於C語言字符串並不保存字符串的長度,若是在執行strcat(char *dest,const char *src)的時候,若是沒有給dest分配足夠多的內存的話,頗有可能就會形成緩衝區溢出。而SDS的空間分配策略杜絕了緩衝區溢出的可能性,由於SDS API會先檢查空閒空間是否知足修改的需求,不知足的話,會擴容以知足空間須要。數據庫
對於C語言字符串的擴容和縮容,頻繁的內存申請和空間釋放,由於內存的申請涉及到比較複雜的分配算法,還須要執行一些比較耗時的系統調用安全
而 SDS則實現了 空間預分配 和 惰性空間釋放函數
空間預分配spa
惰性空間釋放3d
C語言字符串以\0做爲結束符,只能保存文本數據,不能保存圖片、視頻等二進制數據,爲了保證redis適用於各類業務場景,因此SDS都是二進制安全的(binary-safe) , 由於SDS使用length判斷字符串是否結束,因此不存在那樣的問題。日誌