redis中字符串结构没有采用传统的const char*指针来表示,而是设计一种新的SDS字符串结构。
SDS特点:
(1)传统的字符串一般采用strlen()库函数获取长度值,时间复杂度为O(n)。SDS结构中声明一个新的长度变量,用来保存字符串的长度,访问长度的时间复杂度是O(1),是一种典型的空间换取时间的策略。
采用这种策略的原因是redis对键值的操作经常需要访问字符串的长度属性,可以有效提高了运行的时间效率。
(2)传统的字符串可能出现拼接时缓冲区不够的情况,需要程序员手动的分配空间后再拼接;而SDS拼接或者拓展时无需考虑内部空间不够的问题,API内部实现时会检查空间是否完整才扩展。杜绝缓冲区溢出的的可能,提高了使用的安全性。
(3)SDS内部采用的内存分配策略是预分配多余的空间,从而减少分配次数(类似vector容器的内存分配策略)。
采用这种分配策略原因是:使用字符串时经常遇到一种情景是反复修改内容,从而可能需要多次的内存分配。