Redis 沒有直接使用 C 語言原有的字符串,而是創(chuàng)建了一種名為簡單動(dòng)態(tài)字符串(Simple Dynamic String咐刨,SDS)的抽象類型恋脚,并以 SDS 作為默認(rèn)的字符串表示唧领。
SDS 的定義
struct sdshdr{
//記錄buf數(shù)組中已使用的字節(jié)數(shù)量,不包括'\0'孽拷,即SDS所保存的字符串長度
int len;
//buf數(shù)組中為使用的字節(jié)數(shù)量
int free;
char buf[];
};
SDS.png
SDS 的使用
這里先解釋下為什么 Redis 使用 SDS 作為默認(rèn)的 String吨掌。這是因?yàn)樵?Redis 里的鍵值都很大概率是字符串來的,而用戶又有可能經(jīng)常改這些值,如果使用 C 語言原有的字符串在某些情況如拼接字符串的時(shí)候就有可能溢出膜宋,導(dǎo)致出錯(cuò)窿侈,并且在修改字符串時(shí)可能會(huì)很頻繁地重新分配內(nèi)存。
那么 SDS 顯然是針對這些情況作出了優(yōu)化秋茫。
字符串拼接時(shí)史简,由于有 free ,可以很快知道剩余空間是否足夠肛著,并且根據(jù)判斷結(jié)果申請內(nèi)存圆兵。而在申請內(nèi)存的過程中,為了避免下次 append 字符串時(shí)策泣,還要重新申請內(nèi)存衙傀,會(huì)先判斷修改后的字符串是否小于 1M ,是的話萨咕,申請的內(nèi)存為修改后的 2 倍+1字節(jié),即 free = len(修改后的)火本,1 是 ‘\0’危队。如果修改后字符串大于 1M ,就令 len = 30M钙畔,free = 1茫陆。