Redis字符串底层数据结构?
作者:程序员马丁
note
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
答题思路
回答话术
在 Redis 中,没有使用 C 标准库提供的字符串,而是实现了一种名为简单动态字符串(SDS, Simple Dynamic String)的数据结构来表示字符串。
SDS 由长度(len
)、内存空间大小(alloc
)、字符串类型(flags
)和存储的字节数组(buf
)四个部分组成。相较于 C 标准库的字符串,它具备以下优点:
- 高效的长度计算:SDS 记录了字符串长度,因此获取字符串长度时可直接返回,无需遍历每个字符。
- 二进制安全:SDS 不需要根据
\0
特色字符判断字符串是否已经结束,因此可存储任何二进制数据,无需担心因为特殊字符引发异常。 - 高效修改的操作:SDS 记录了内存空间大小,因此写入时可计算剩余空间并决定是否自动扩容,结合追加字符串时的空间预分配和截取字符串时的惰性删除策略,最大程度的减少了修改时的内存重新分配次数。
- 节省内存:Redis 设计了五种不同类型的 SDS,每种对应某一大小范围的字符串,因此可以根据字符串的大小选择占用空间最少的 SDS 类型,并且不使用编译器的内存对齐,而是按实际大小分配内存。最大程度节省了内存。