【Redis设计与实现】第2章 简单动态字符串

简单动态字符串

    Redis并不直接使用C语言字符串,而是本身构建一套简单动态字符串(simple dynamic string ,SDS)C字符串仅仅在一些无需对字符串进行修改的地方使用,例如打印日志。SDS除了用来保存数据库里面的字符串,还被用作缓冲区,AOF缓冲区,客户端状态中的输入缓冲区,都使用了SDS。redis

2.1 SDS的定义

2.2 SDS与C字符串的区别

2.2.1 常数复杂度获取字符串长度

    C语言字符串获取长度 须要遍历整个字符串 时间复杂度为O(n) 而SDS为O(1)算法

2.2.2 杜绝缓冲区溢出

    由于C语言字符串并不保存字符串的长度,若是在执行strcat(char *dest,const char *src)的时候,若是没有给dest分配足够多的内存的话,颇有可能就会形成缓冲区溢出。而SDS的空间分配策略杜绝了缓冲区溢出的可能性,由于SDS API会先检查空闲空间是否知足修改的需求,不知足的话,会扩容以知足空间须要。数据库

2.2.3 减小内存重分配次数

    对于C语言字符串的扩容和缩容,频繁的内存申请和空间释放,由于内存的申请涉及到比较复杂的分配算法,还须要执行一些比较耗时的系统调用安全

而 SDS则实现了 空间预分配 惰性空间释放函数

空间预分配spa

惰性空间释放3d

2.2.4 二进制安全

C语言字符串以\0做为结束符,只能保存文本数据,不能保存图片、视频等二进制数据,为了保证redis适用于各类业务场景,因此SDS都是二进制安全的(binary-safe) , 由于SDS使用length判断字符串是否结束,因此不存在那样的问题。日志

2.2.5 兼容部分C字符函数

2.2.6 总结

2.3 重点回顾

相关文章
相关标签/搜索