Redis只会使用C字符串作为字面量。大多数情况下,redis使用SDS作为字符串表示
SDS (simple dynamic string)
struct sdshdr {
int len; //记录buf数组中已使用字节的数量,等于SDS所保存字符串的长度
int free; //记录buf数组中未使用字节的数量
char buf[]; //字节数组,用于保存字符串
};
C字符串和SDS之间的比较,也是为什么使用SDS的原因:
- 直接通过字段获取字符串长度,提高了效率
- C字符串处理函数存在安全问题,如strcat
- SDS有空间预分配,有一套自己的扩容机制,在这该机制下,加少了重生内存分配的次数
- C字符串以"\0"结束,二进制不安全
- SDS仍然可以利用C字符串的函数
SDS的free空间来自两种策略
-
空间预分配
若修改之后的len<1MB, 则分配 free = len
若修改之后的len>=1MB, 则分配free = 1 MB
-
惰性空间释放
例如:sdstrim会对两端无用删减后,字符串整体位移到首部