SDS(simple dynamic string)簡單動態字符串
SDS與C語言字符串在redis用法上的區別:
C語言字符串用於字符串不被修改的地方,如日誌輸出
SDS是一個可以被修改的字符串,如鍵,值
結構體保存在sds.h/sdsdr文件中
struct sdhdr{
//記錄buf數組中已經使用的字節的數量
int len;
//記錄buf數組中未使用的數量
int free;
//字節數組用於保存字符串
char buf[];
};
注意C語言字符串的最後一個空字符‘\0’不屬於len
打印字符串時用
printf("%s",s->buf);
SDS與C語言字符串的區別
1.常數複雜度獲取自婦產長度
C語言求長度是需要遍歷的
2.杜絕緩衝區溢出
C語言有一個函數
char *strcat(char*dest,const char*src);
用於把src字符串拼接到dest上面,但是如果dest空間不足就會產生溢出。
Redis有自己的SDS拼接函數sdscat用於拼接,會先檢查是否有足夠大的內存空間,不夠就進行內存拓展,然後再進行拼接。
3.減少修改字符串帶來的內存分配次數
C語言不用說,每次都是重新分配,但是SDS不一樣,實現了:
- 空間預分配
- 若對SDS修改之後,長度小於1MB,則分配 len+free+1長度的空間
- 若大於小於1MB,則會分配len+1MB+1byte的空間
- 惰性空間釋放
如sdstrim(s,“xy”)會刪除s中xy字母,那麼可能會多出一定的空間,redis並不進行釋放,而是留着以免後面的使用
3.二進制安全
C語言字符串以空字符結尾,比如當讀入字符串的時候,遇到空格就會結束,但是SDS是以len的長度來判斷結束的,而且C語言字符串不能保存音,視頻等文件,但是SDS保存的是二進制數據。