Redis里面使用sdshdr结构体来保存字符串,结构体结构如下:
struct sdshdr{ int len;//已使用保存的字符串长度 int free;//未使用字符串长度 char buf[];保存字符串的数组 }
这里test字符串保存到buf数组中,“\0”表示字符串结束标志,len表示字符长度,free表示未使用空间为0
这里我们也是存了test数组,不过buf却有多余的空间,这个free=2表示的就是这个多余的空间,下面说下redis 使用sdshdr结构体的好处。
-
获取字符串长度快到极致,直接读取len
-
防止缓冲区溢出,因为可以读取len判断是否溢出
-
减少内存重分配次数通过free来预分配和惰性释放
-
二进制安全(防止\0过滤)
-
兼容部分c字符串函数stirng.h