Redis数据类型之字符串

1 Redis数据结构之字符串

    Reds自己构建了一种名为简单动态字符串的抽象啊类型(simple dynamic string,SDS),并将SDS用作Redis的默认字符串表示。

   在Redis中,字符串的键值对在底层都是由SDS实现的,比如,SET key "helloworld" 那么Redis在数据库中创建一个新的键值对,其中,键值对的键是一个字符串对象,底层实现是一个保存着字符串"key"的简单动态字符串;键值对的值是一个字符串对象,底层实现是一个保存着字符串"helloworld"的简单动态字符串;

2 SDS的存储结构

struct sdshdr{
    // 记录buf数组已使用字节的数量
    // 等于SDS所保存字符串的长度
    int len;
    // 记录buf中未使用字节的数量
    int free;
    // 字节数组,用于保存字符串
    char buf[];
}

例如:

Redis数据类型之字符串_第1张图片

该实例中:free为0,说明,该SDS中没有分配任何未使用空间;

                   len为5,说明,该SDS中保存的字符串长度为5

                   buf是一个char类型的数组,保存了五个字符,最后一个字符是空字符'\0';因为Redis底层实现使用的C语言,C语言中数组长度为N+1,最后一个元素总是空字符。

3 SDS与C字符串的区别

Redis数据类型之字符串_第2张图片

4 Redis获取字符串长度的复杂度为O(1)

因为简单动态字符串中自己保存了字符串的长度,可直接获取,不需要C语言中的指针移动计算大小

5不会造成缓冲区溢出

在Redis中进行修改(字符串拼接)之前,会先检查len和free属性,即len+free+1 是否会小于拼接之后的字符串长度,如果空间不够会自动将SDS的空间扩展至执行修改所需的大小,然后才执行实际的修改操作,也就不会出现缓冲区内存溢出的情况。

6减少修改字符串时带来的内存重分配次数

Redis通过空间预分配和惰性空间释放进行区别C字符串中的内存重分配机制

 空间预分配:

Redis数据类型之字符串_第3张图片

 

惰性空间释放

 

 

以上就是Redis数据结构字符串的底层实现原理

参考资料来源《redis设计与实现》

你可能感兴趣的:(Redis,redis字符串底层实现,redis字符串,简单动态字符串)