Redis只会使用C字符串做为字面量,在大多数状况下,Redis使用SDS做为字符串表示。redis
比起C字符串,SDS具备如下优势:数组
struct sdshdr {
// buf 中已占用空间的长度
int len;
// buf 中剩余可用空间的长度
int free;
// 数据空间
char buf[];
};
复制代码
len记录buf数组中已使用字节的数量,等于SDS所保存的字段长度。free记录buf数组中未使用字节的数量。buf为字符串的数据空间,它的长度为len+free+1,由于它须要多存一个'\0'做为结束标识。安全
C语言中的字符串为Null-terminated String,它用'\0'来表示字符串的结束。而且除了字符串末尾以外,字符串内不能包含空字符,不然最早被读到的空字符会被误认为结束标识。bash
这种存储二进制和读取不一致的状况被称为Binary Unsafe。为了实现二进制安全,redis采用len属性来记录当前字符串长度。数据结构