【redis】字符串实现原理sds

redis 键值对中的key都是string类型的。redis内部实现中是怎么处理string呢?redis底层是用c写的,对于stirng并没有直接使用c的字符数组,而是自己封装了一个sds的类型。结构如下:

【redis】字符串实现原理sdsbuf数组用于存真正的字符。

为什么要新建数据类型?必然是为了抽象,是的编程更加简单。原有的c的字符串的api是不安全的,因为在使用字符数组以后,需要跟踪内存的分配。在使用之前,需要预分配空间,否则会有缓冲区溢出(当然目前,一般的编译器都会用canary值来杜绝,编译时报一个错误)。用完一个字符串需要回收,否则会有内存泄漏。

为了使编程时尽可能少的考虑这些,就要把分配内存的事情封起来,不让调用方得知,这就是sds的作用。

每一次创建一个新的string时,不会按照实际大小分配,而是预分配更多的内存,当字符串截断时,也不是立刻回收内存,而是减少len值,增加free值。字符串插入时,先看free够不够,不够再分配。这样减少了内存分配回收的次数,效率更高。对应的策略叫做:空间预分配 和 惰性回收。

上图:

【redis】字符串实现原理sds

使用了以上sds数据类型,为编程带来的好处有三点:

(1)获取长度变为了O1的操作。

(2)杜绝了缓冲区溢出。

(3)减少了字符串改变造成的空间分配次数。