面试题答案
一键面试数据组织方式
- 简单动态字符串(SDS):Redis中的字符串类型通常基于简单动态字符串(SDS)结构存储。SDS是Redis自定义的一种字符串表示,其结构为:
struct sdshdr {
int len; // 已使用的长度
int free; // 未使用的长度
char buf[]; // 存储字符串内容的数组
};
在RDB文件中,字符串类型数据也是以类似的概念进行组织。它会记录字符串的长度信息以及实际的字符数据。 2. 编码方式选择:根据字符串内容的不同,Redis会选择不同的编码方式来存储字符串,从而优化内存使用和操作效率。
编码细节
- INT编码:当字符串内容是整数值且可以用64位有符号整数表示时,会采用INT编码。在RDB文件中,直接以相应的整数格式存储该值,节省空间并且在进行数值操作时效率高。
- EMBSTR编码:如果字符串长度小于等于39字节,会采用EMBSTR编码。这种编码方式将
sdshdr
和实际的字符串内容分配在一块连续的内存空间,减少内存碎片,同时创建和释放内存的开销也较小。在RDB文件中,会按照EMBSTR的结构规则来存储相关信息,包括长度等。 - RAW编码:当字符串长度大于39字节时,使用RAW编码。此时
sdshdr
和字符串内容是分开分配内存的。在RDB文件中,同样按RAW编码的结构规则存储,先记录长度,再存储实际的字符串内容。