图解Redis之数据结构篇——简单动态字符串SDS (2)

    C字符串中的字符必须符合某种编码(比如ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾,这些限制使得C字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。如果有一种使用空字符来分割多个单词的特殊数据格式,就不能用C字符串来表示,如"Redis\0String",C字符串的函数会把'\0'当做结束符来处理,而忽略到后面的"String"。而SDS的buf字节数组不是在保存字符,而是一系列二进制数组,SDS API都会以二进制的方式来处理buf数组里的数据,使用len属性的值而不是空字符来判断字符串是否结束。

2.4 时间复杂度

    我们来看几个Redis常见操作的时间复杂度。

获取SDS长度: 由于SDS中提供了len属性,因此我们可以直接获取时间复杂度为O(1),C字符串为O(n)。

获取SDS未使用空间长度: 时间复杂度为0(1),原因同1。

清除SDS保存的内容:由于惰性空间分配策略,复杂度为O(1)。

创建一个长度为N的字符串:时间复杂度为O(n)。

拼接一个长度为N的C字符串:时间复杂度为O(n)。

拼接一个长度为N的SDS字符串:时间复杂度为O(n)。

Redis在获取字符串长度上的时间复杂度为常数级O(1)。

2.5 为什么要使用SDS

    通过以上分析,我们可以得到,SDS这种数据结构相对于C字符串有以下优点:

杜绝缓冲区溢出

减少字符串操作中的内存重分配次数

二进制安全

由于SDS遵循以空字符结尾的惯例,因此兼容部门C字符串函数

Redis定位于一个高性能的内存数据库,其面向的就是大数据量,大并发,频繁读写,高响应速度的业务。因此在保证安全稳定的情况下,性能的提升非常重要。而SDS这种数据结构屏蔽了C字符串的一些缺点,可以提供安全高性能的字符串操作。

三、小结

    Redis在互联网项目中的应用越来越广泛,会用只是学习Redis中最简单的一步,要想真正的成为Redis高手,了解其底层的实现必不可少。本篇文章简单介绍了Redis中SDS数据结构及其特性,分析了Redis SDS的空间分配策略和其与C字符串相比的优势,后续的文章将继续分享Redis底层实现的其它数据结构。未完待续......

四、参考

《Redis设计与实现》

《Redis开发与运维》

《Redis官方文档》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspsgj.html