第44题: Redis 的String 是怎么实现的?为什么不直接用c的字符串?
Redis 没有直接使用C 语言的字符串表示,而是自己构建一种简单动态字符串(SDS: simple dynamic string)。
Redis 中的String 都是SDS,例如我们执行这样一条命令:
redis> SET blog angela
那么Redis 在内存中创建了一个键值对,
-
键:键是一个字符串对象,对应底层实现是一个保存字符串“blog” 的SDS; -
值:值也是一个字符串对象,对应底层实现是一个保存字符串是“angela”的SDS。
如果执行
redis> RPUSH blog "angela" "de" "blog"
那么Redis 将在内存中创建一个键值对,键还是一个SDS,存放“blog”,值是一个列表,存放三个SDS,“angela”、“de”、“blog”
SDS如何实现的呢?
首先SDS被定义为这样一个结构体:
struct sdshdr {
char buf[];//字节数组,用于保存字符串
int len;//记录buf数组中已使用字节的数量
int free;//记录buf数组中未使用字节的数量
}
举个例子:
现有执行redis> SET blog angela
命令后,value值在redis 中存放如下图所示,buf存放字节数组(真实数据),len表示存放字符串的长度(不包括结束符号’