面试题答案
一键面试1. 编码方式
在Redis中,字符串类型可能采用以下编码方式存储在RDB文件:
- int编码:当字符串内容是整数值,且这个整数值在
LONG_MIN
到LONG_MAX
之间时,Redis会使用int
编码来存储该字符串。例如,字符串"12345"就可能采用int
编码,这种编码方式直接存储整数值,占用空间少,效率高。 - embstr编码:如果字符串长度小于等于39字节,Redis会采用
embstr
编码。embstr
编码将RedisObject和SDS(简单动态字符串)连续存储在一块内存中,减少内存碎片,提高内存利用率。这种编码方式在创建和释放时只需一次内存分配和释放操作。 - raw编码:当字符串长度大于39字节时,会使用
raw
编码。raw
编码下,RedisObject和SDS是分开存储的,需要两次内存分配和释放操作,相对embstr
会产生更多内存碎片。
2. 存储结构
- RedisObject结构:在RDB文件中,每个对象都以
RedisObject
结构作为头部。RedisObject
包含了对象的类型(这里为字符串类型)、编码方式、引用计数以及指向实际数据的指针等信息。对于字符串类型,type
字段标识为字符串类型,encoding
字段标识上述提到的编码方式。 - SDS结构(针对embstr和raw编码):简单动态字符串(SDS)是Redis中字符串的实际存储结构。SDS结构包含三个部分:
- len:记录字符串的实际长度。
- alloc:记录已分配的空间长度。
- buf[]:存储实际的字符串内容,以'\0'结尾。例如,对于字符串"hello",
len
为5,alloc
至少为6(包含'\0'),buf
数组中存储'h', 'e', 'l', 'l', 'o', '\0'。在embstr
编码中,RedisObject
和SDS
紧凑存储;而在raw
编码中,它们分开存储。
- 整数值存储(针对int编码):当采用
int
编码时,直接在RedisObject
结构内存储整数值,无需SDS结构。例如,如果字符串内容是"100",在int
编码下,直接在RedisObject
对应位置存储100这个整数值。