宁波新亚建设公司网站,专业网站设计发展前景,wordpress 5正式版,网站开发团队职能数据结构与对象
简单动态字符串
概述
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组#xff0c;简称C字符串)#xff0c;而是自己构建了一种名为简单动态字符串(Simple Dynamic String, SDS)的后向类型#xff0c;并将SDS用作Redis的默认字符串表示。在…数据结构与对象
简单动态字符串
概述
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组简称C字符串)而是自己构建了一种名为简单动态字符串(Simple Dynamic String, SDS)的后向类型并将SDS用作Redis的默认字符串表示。在Redis里面C字符串只会作为字符串字面量(string literal)用在一些无须对字符串值进行修改的地方。比如打印日志。
当Redis需要的不仅仅是一个字符串字面量而是一个可以被修改的字符串时Redis就会使用SDS来表示字符串值比如在Redis的数据库里面包含字符串值的键值对在底层都是由SDS来实现的
除了用来保存数据库中的字符串值之外SDS还被用作缓冲区(buffer)AOF模块中的AOF缓冲区、以及客户端状态中的输入缓冲区都是由SDS实现的
定义 每个sds.h/sdshdr结构表示一个SDS值如图.
SDS遵循C字符串以空字符结尾的惯例保存空字符的1字节空间不计算在SDS的len属性里面并且为空字符分配额外的1字节空间以及添加空字符到字符串末尾等操作都是由SDS函数自动完成的所以这个空字符对于SDS的使用者来说是完全透明的。遵循空字符结尾这一惯例 的好处是SDS可以直接重用一部分C字符串函数库里的函数例如printf函数
printf(%s, s-buf)来打印SDS保存的字符串值Redis,而无需为SDS编写专门的打印函数
1.free属性的值为0表示这个SDS没有分配任何未使用空间2.len属性的值为5表示这个SDS保存了一个5字节长的字符串3.buf属性是一个char类型的数组数组的前5个字节分为保存了 ‘R’、‘e’、‘d’、‘i’、‘s’五个字符最后一个字节则保存了空字符’\0’ 这个SDS和上面的SDS的区别在于这个SDS为buf数组分配了5字节未使用空间所以它的free属性的值为5
SDS与C字符串的区别
根据传统C语言使用长度为N1的字符串数组来表示长度为N的字符串并且字符数组的最后一个元素总是空字符’\0’,如图所示。 C语言使用的这种简单的字符串表示方式并不能满足Redis对字符串在安全性、效率性以及功能方面的要求
1.常数复杂度获取字符串长度
因为C字符串并不记录自身的长度信息所以为了获取一个C字符串的长度程序必须遍历整个字符串对遇到的每个字符进行计数知道遇到代表字符串结尾的空字符为止这个操作的复杂度为O(N)。 和C字符串不同因为SDS在len属性中记录了SDS本身的长度所以获取一个SDS长度的复杂读仅为O(1).设置和更新SDS长度的工作是由SDS的API在执行时自动完成使用SDS无须进行任何手动修改长度的工作通过SDS而不是C字符串Redis将获取字符串长度所需的复杂度从O(N)降低到了O(1)这确保了获取字符串长度的工作不会 成为Redis的性能瓶颈。例如因为字符串键在底层使用SDS来实现所以即使我们对一个非常长的字符串键反复执行STRLEN命令也不会对系统性能造成任何影响因为STRLEN命令的复杂度仅为O(1)