SDS定义
简单动态字符串(Simple Dynamic String),又称SDS。是redis中用来表示字符串的一种数据结构,我们可以在sds.h头文件中找到有关它的结构体定义:
struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; //已保存的字符串字节数 uint8_t alloc; //申请的总字节数 unsigned char flags; //不同SDS的头类型,用来控制SDS的头大小 char buf[]; };
其中的char[]为实际保存的数据,它可以存储任意二进制数据,并且实现了C字符串的所有函数操作,如字符串拼接、截取、查询等。
SDS特点
SDS结构体具有以下特点和优势:
-
动态扩展:SDS采用动态扩展的策略来管理字符串的内存空间,避免了每次操作都需要重新分配内存的性能损耗。
-
内存预分配:SDS在分配内存空间时,会首先分配一定的额外空间,减少频繁扩容操作。
-
二进制安全:SDS可以存储任意二进制数据,并且不会因为字符串中包含
\0
字符而出现字符串截断的情况。 -
内部空间信息:SDS通过
len
和alloc
字段记录了字符串的长度和未使用空间长度,方便快速获取字符串长度且动态扩展时的内存分配。
SDS编码
在Redis中,SDS可以使用不同的编码方式来存储字符串数据,根据数据类型和数据长度的不同,可以选择最适合的编码方式。以下是Redis中SDS的不同编码方式:
-
RAW 编码:
-
当字符串小于1MB且可以完全存储在SDS结构体的 buf 字段中时,采用 RAW 编码。
-
RAW 编码存储的字符串数据以字节数组的形式直接存储在SDS结构体内部的 buf 字段中,不需要额外的内存分配。
-
-
EMBSTR 编码:
-
当字符串长度小于等于44字节时,采用 EMBSTR 编码。
-
EMBSTR 编码在SDS结构体的 buf 字段中存储字符串数据,并且在 buf 后面留出一定的空间,用于进行字符串操作后的扩容。
-
-
INT 编码:
-
当字符串可以转换为整数且符合整数值的范围时(特别是长整数),字符串可以采用 INT 编码。
-
INT 编码将整数转换并存储在 buf 字段中,避免了字符串数据的存储和处理开销。
-