Redis研究-1.简单动态字符串
3 月,跳不动了?>>> 我们知道,在C字符串中,底层的实现是使用c字符数组来实现的,但是在高性能以及内存安全方面,使用底层的c字符串是满足不了的,举个简单的例子,如果你使用strcat(s,s1)函数,如果在操作之前不判断s的空间是否能够容纳s1的内容,那么就很有可能导致内存溢出,而导致操作失败,因此,为了满足性能及内存安全方面的要求,Redis实现了SDS。 SDS的定义是(位于sds.h): struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间,默认是使用C字符串的空字符结尾的 char buf[]; }; 其中每项的含义已经在注释中说明。 通过上面的定义,我们可以看到,sds与传统的c字符串做了几方面的优化: 在sds中,记录了“字符数组”的的长度len; 通过使用free可以实现预分配策略优化。 通过这两方面的优化,我们可以得到以下方面的提升: 在做需要设计到内存扩展方面的操作的时候,只要检查free属性,就可以很容易得到是否需要扩展内存,从而避免内存溢出; 在获取字符串长度方面,再也不用花费O(N)时间复杂度,只主要获得len属性就可以得到长度,时间复杂度变为O(1); 我们知道,C字符串和底层数组之间是有密切联系的,因此每次增加或者缩短一个C字符串