简介
Redis 的底层数据结构主要以下几种:
- SDS(Simple Dynamic String, 简单动态字符串)
- ZipList(压缩列表)
- QuickList(快表)
- Dict(字典)
- IntSet(整数集合)
- ZSkipList(跳跃表)
简单动态字符串
在 Redis 中,并不会直接使用 C 语言自带的字符串结构作为实际的存储结构,而只是将字符串作为字面量使用,大多数情况使用自定义的 SDS 来表示字符串。
SDS 主要用于储存 Redis 的默认字符串表示、AOF 模块中的 AOF 缓冲区、客户端状态输入缓冲区。它的定义如下:
struct sdshdr {
int len; // 记录 buf 数组中已使用字节的数量,等于 SDS 所保存的字符串的长度
int alloc; // 记录 buf 数组中未使用字节的数量
char buf[]; // 字节数组,用于保存字符串
};
优点
相对于 C 语言的字符串实现,Redis 实现的 SDS 有以下优点:
- 通过记录
len
属性,实现常数级时间复杂度获取字符串长度 - 通过检查
len
属性,避免字符串在修改时出现缓冲区溢出的情况 - 通过记录
len
属性和alloc
属性,对于修改字符串实现了空间预分配和惰性空间释放 - 实际存储的
buf
是一个字节数组,可以实现 SDS 安全操作二进制数据 - SDS 仍然以