Redis是C语言写的,但不是直接使用C的字符串,而是使用自己实现的简单动态字符串SDS(Simple dynamic String)。
当键值对的键是字符串,底层使用存储字符串的SDS;键值对的值是字符串,底层使用的还是SDS,SDS的数据结构如下:
SDS样例:
为了避免频繁修改场景的情况下内存重新分配的情况,会进行内存预分配,具体如下:
对SDS修改后,实际字符串长度(length属性)小于1M,程序会分配和Length同样大小的未使用字符串,如果修改后大于等于1M,则会分配1M的未使用空间,如下len是13,free是13,即提前预分配了13个未使用字符串。
SDS修改,删除部分字符串后,底层不会释放已分配的内存,而是修改free的值,这样下次SDS修改新增字符串不用重新分配内存。
SDS的buf是字节数组byte[]而非字符数组,加上len记录实际长度,所以redis是二进制安全,意味着不止是保存文本数据,保存其它二进制文件也是可以的。