Redis并不直接使用C语言字符串,而是本身构建一套简单动态字符串(simple dynamic string ,SDS)C字符串仅仅在一些无需对字符串进行修改的地方使用,例如打印日志。SDS除了用来保存数据库里面的字符串,还被用作缓冲区,AOF缓冲区,客户端状态中的输入缓冲区,都使用了SDS。redis
C语言字符串获取长度 须要遍历整个字符串 时间复杂度为O(n) 而SDS为O(1)算法
由于C语言字符串并不保存字符串的长度,若是在执行strcat(char *dest,const char *src)的时候,若是没有给dest分配足够多的内存的话,颇有可能就会形成缓冲区溢出。而SDS的空间分配策略杜绝了缓冲区溢出的可能性,由于SDS API会先检查空闲空间是否知足修改的需求,不知足的话,会扩容以知足空间须要。数据库
对于C语言字符串的扩容和缩容,频繁的内存申请和空间释放,由于内存的申请涉及到比较复杂的分配算法,还须要执行一些比较耗时的系统调用安全
而 SDS则实现了 空间预分配 和 惰性空间释放函数
空间预分配spa
惰性空间释放3d
C语言字符串以\0做为结束符,只能保存文本数据,不能保存图片、视频等二进制数据,为了保证redis适用于各类业务场景,因此SDS都是二进制安全的(binary-safe) , 由于SDS使用length判断字符串是否结束,因此不存在那样的问题。日志