redis系列之------简单的动态字符串(SDS)
前言 Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。 个人感觉 SDS 类似于Java的 ArrayList, 大家可以拿两者对比一些,谁的效率更加高一点。 SDS定义 1 struct sdshdr { 2 3 // 记录 buf 数组中已使用字节的数量 4 // 等于 SDS 所保存字符串的长度 5 int len; 6 7 // 记录 buf 数组中未使用字节的数量 8 int free ; 9 10 // 字节数组,用于保存字符串 11 char buf[]; 12 13 }; 这里注意一下。C语言的char是 占一个字节的。 不像Java的char占两个字节。也就是只有八位,-127 - 128。 SDS相比于C字符串的优势 1. 常数复杂度获取字符串长度 这个比较好理解,因为SDS里面有一个字段为len,可以直接获取长度 2. 减少修改字符串时带来的内存重分配次数 因为传统的c字符串,不会自动扩容。而且其内存大小就等于字符串长度+1,因此,每修改一次字符串,都要重新分配一次内存,非常的耗费时间 SDS 会自动扩容,并且会进行空间预分配。比如现在有一个 Hello