小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
SDS与C字符串区别
我们再看一下sds的数据结构定义,这是很重要的一部分。
sds.h中有sds的结构定义
// sdshdr 结构
struct sdshdr {
// buf 已占用长度
int len;
// buf 剩余可用长度
int free;
// 实际保存字符串数据的地方
// 利用c99(C99 specification 6.7.2.1.16)中引入的 flexible array member,通过buf来引用sdshdr后面的地址,
// 详情google "flexible array member"
char buf[];
};
二进制安全
C字符串中不能包含空字符,否则程序读入的空字符将被误认为字符串结尾,所以c字符串只能保存文本数据,不能保存图片,音频,视频,压缩文件等二进制数据
SDS API以处理二进制的方式处理SDS存放的数据,reids使用二进制安全的SDS保存任意格式的二进制数据
兼容部分C字符串函数
SDS遵循C字符串以空字符结尾的惯例,保存文本数据的SDS可以重用c语言的<string.h>的库定义的函数
总结
redis使用SDS作为字符串表示,比C字符串的优势:
- 获取字符串长度复杂度O(1)
- 杜绝缓冲区溢出
- 减少修改字符串时带来的内存重分配次数
- 增长操作的空间预分配
- 减少操作的惰性空间释放
- 二进制安全
- 兼容部分C字符串函数
好了,这就是对redis为什么要自定义一个数据结构而不是使用c字符串的解释了。