1.1简介
Redis没有直接使用C语言的字符串表示(以空字符结尾的字符数组),而是自己创建了一种名
为简单动态字符串的结构,并标识未SDS。
为什么Redis不直接使用C字符串而要自己创建新结构呢?这就不得不介绍下SDS的组成。
1.2SDS组成
1.len属性,标识这个SDS当前保存的字节长度。
2.free属性,标识这个SDS未使用的字节长度。
3.buf属性,标识字节数组,字符串的值保存在此属性当中,以一个‘\0’结尾。
SDS遵循了C字符串以空字符结尾的习惯,这使得,SDS可以直接重用一部分C字符串的函数。
1.3SDS和C字符串区别
1.O(1)复杂度获取长度
和C字符串需要遍历字符数组计算长度相比,SDS直接读取len属性即可获取字符长度,对于高并发的redis
来说,确保不会因为字符长度的获取而影响性能。
2.杜绝缓冲区溢出
C字符串在进行字符串拼接时,如果未提前分配空间,则会出现内存溢出的问题,而SDS则读取free值来检
查当前空前是否足以容纳拼接后的字符,如不够则会自动扩容。
3.减少字符串修改带来的内存重新分配
因为C字符串没有记录自身的长度,每次对字符串的修改都会重新分配一次内存,对于redis频繁修改的场景
来说
显然不符合,所以SDS做了一些优化,
1)空间预分配:SDS在进行字符串增长操作时,会根据公式额外分配空间。
2)惰性释放:SDS在进行字符串缩短操作时,不会立刻重新分配内存,而是修改自身len和free属性,
等待将来继续使用。
4.二进制安全
C字符串除了字符串末尾之外,内部不可以包含空字符,这显然不符合redis的使用场景,所以SDS使用len
读取字符串解决了传统C字符串遇到空字符结束的问题。