Redis没有直接使C语言传统的的字符串(以空字符串结尾的字符数组,简称C字符串),而是本身构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用做Redis的默认字符串表示。redis
好比,客户端执行命令:数据库
redis>SET msg "hello world";
ok
复制代码
那么Redis将在数据库中建立两个SDS分别存储键和值。api
每一个sds.h/sdshrd结构表示一个SDS值:数组
struct sdshrd{
// 记录buf数组中已使用字节的数量
// 等于SDS所保存字符串长度
int len;
// 记录buf数组中未使用的字节数量
int free;
// 字节数组,用于保存字符串
char buf[];
}
复制代码
因此上面set msg "hello world",值在的SDS中的样子以下: 安全
C字符串获取长度须要遍历整个字符串,复杂度为O(N),而是用SDS的话,由于使用了一个len属性来记录字符串长度,因此获取长度的复杂度为O(1)。bash
C字符串中的字符必须符合某种编码(好比ASCII),而且除了字符串的末尾以外,字符串里面不能包含空字符串,不然最早被程序读入的空字符串会被误认为是字符串末尾,这些限制使得C字符串只能保存文本数据,不能保存像图片、音频、视频等这样子的二进制数据。函数
Redis中的SDS的api都是二进制安全的,会以二进制的方式来处理SDS存放buf数组里的数据,程序不会对其中的数据作任何限制、过滤等,数据在写入时是什么样的,它被读取时就是什么样子。编码
使用SDS来保存以前提到的特殊数据格式(好比音频,视频等)就没有任何问题,由于SDS使用len属性的值而不是字符串来判断字符串是否结束。因此使用二进制安全的SDS,使得Redis不只考验保存文本数据,还能够保存任意格式的二进制数据。spa
参考书籍:《Redis设计与实现》设计