课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
字符串是程序员在学习计算机编程开发语言的时候需要重点掌握的一个计算机编程知识点,而本文我们就通过案例分析来简单了解一下,Redis字符串应用类型与用法分析。
Redis使用简单动态字符串(simpledynamicstring,SDS)来表示字符串,Redis中字符串类型包含的数据结构有:整数(R_INT)、字符串(R_RAW)。我们以字符串为例子,常规的字符串,如"Brand",如果要获取他的长度,需要从头开始遍历,直至遇到\0空字符代表结尾,如C字符串。
C字符串结构与SDS字符串结构对比图参照如下:
free属性的值为0,表示这个SDS没有分配任何未使用空间。
len属性的值为5,表示这个SDS保存了一个5字节长度的字符串。
buf是一个char类型的数组,存储真实的字符串,数组的前五个字节分别保存了'B'、'r'、'a'、'n'、'd'五个字符,而后一个字节则保存了空字符'\0',代表结尾。
注意:SDS遵循C字符串的惯例以空字符结尾,保存空字符的1字节不计算在SDS的len属性中。
比起C字符串,SDS具有以下优点:
度获取字符串长度时间复杂度为O(1)。
C字符串不记录自身长度,获取C字符串长度时必须遍历整个字符串计数得到,复杂度是O(N)
SDS字符串自身记录维护len长度属性,获得SDS字符串长度的复杂度是O(1)
杜绝缓冲区溢出。
C字符串不记录长度,由于两个C字符串在内存存储上紧邻,在执行字符串拼接strcat时,如果不提前分配足够空间,很可能发生修改s1的数据溢出到s2所在的空间中(缓冲区溢出)。
SDS杜绝了缓冲区溢出问题,它记录了长度,当修改SDS字符串之前,API都会检查SDS的空间是否满足修改的要求,不满足API会自动进行空间扩展。
空间预分配,减少修改时的内存重分配次数
SDS被修改后,程序不仅会为SDS分配所需要的空间,还会分配额外的未使用空间。这样,Redis可以减少连续执行字符串增长操作所需的内存重分配次数。
具体分配未使用空间如下2种方式:
如修改后长度len小于1MB,就分配和len属性相同大小的未使用空间:free=len。
如修改后长度len大于等于1MB,就分配1M的未使用空间:free=1MB。
惰性空间释放
惰性空间释放,缩短操作时:SDS避免了缩短字符串时所需的内存重分配操作,并为将来可能有的增长操作提供了优化。当SDS做缩短操作,不会立刻使用内存重分配来收回缩短后多出来的字节,而是保持在free属性里。将来如果需要append操作,则直接使用free中未使用的空间,减少了内存的分配步骤。
另外,SDS也提供了API手动进行释放SDS未使用空间,避免惰性释放策略会造成内存浪费。
二进制安全
C字符串的字符必须符合某种编码,除结尾空字符以外,字符串内部不允许有空字符串,存储有局限性。而在Redis中,不仅可以存储String类型的数据,也可能存储一些二进制数据。
二进制数据并不是规则的字符串格式,其中会包含一些特殊的字符如'\0'。在C中遇到'\0'则表示字符串的结束,但SDS不是,它是以len长度标识结尾。
兼容部分C字符串函数。
SDS虽然是二进制安全的,但还是秉承C字符串以空字符结尾的特性,很多函数与C字符串一致不需要重写。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。