一.字符串

1.会记录保存的SDS字符串的长度,所以获取字符串长度就可以从O(N)降到O(1)

2.C语言不记录数据长度,需要自己分配好内存,才可以进行扩展,默认是已经分配好足够的空间。SDS每次修改字符串,都会进行自动分配内存,而不需要程序员进行分配。避免了内存溢出

3.进行预分配,避免了每次操作都进行内存分配,减少分配次数,减少性能消耗

SDS的数据存储模型Redis设计与实现-01-字符串

未进行内存预分配Redis设计与实现-01-字符串

进行了内存预分配Redis设计与实现-01-字符串

二.

1.空间预分配

 空间预分配用于优化SDS的字符串增长的操作,当SDS的API对一个SDS进行修改,并且对SDS进行空间扩充的时候,程序不仅会分配修改所需要用的空间,还会分配额外的未使用空间

如果字符串长度小于1M,则会分配与数据相同长度的未使用空间,如果大于等于1M,则会分配1M空间

进行数据修改时候,在SDS进行进行扩展之前,会先判断预分配空间是否够用,如果够用则直接使用即可,不够时候,再进行扩展,将扩展次数从必定N次降低为最多N次

2.惰性释放空间

释放用于优化SDS的字符串缩短的操作,当SDS的API需要缩短字符串的时候,并不会马上使用内存重新分配来回收缩短出来的内存空间,而是将这些空间的数量使用free属性进行记录,并留与未来字符串增长变化使用

Redis设计与实现-01-字符串

Redis设计与实现-01-字符串

3.二进制安全

C语言中的字符必须符合某种编码格式,并且除了字符串尾部之外不能有空符串,否则会被解析为字符串结尾,丢失后面的数据

例如 “Redis Cluster” 就只会识别Redis,而丢失Cluster,

而SDS的API都是二进制安全的,所有的API都是以二进制的方式处理SDS存储的buf数组的数据,程序不会对数据进行任何限制,过滤,假设,写入的是什么样子,他被读取的就是什么样子

使用SDS保存数据,而不是C字符串,使得Redis不仅可以保存文本数据,还可以保存任意格式的数据

Redis设计与实现-01-字符串

相关文章: