redis--简单动态字符串

简单动态字符串

Redis没有直接使用C语言传统的字符串表示,而是构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,将SDS用作Redis的默认字符串表示。

在Redis里边,C字符串只会作为字符串面量用在一些无需对字符串的值进行修改的地方。

1、SDS的定义

SDS的结构如下:

struct sdshdr {
    //记录buf数组中已经使用的字节数量
    int len;
    //记录buf数组中未使用字节的数量
    int free;
    //字节数组,用于保存字符串
    char buf[];
};
结构

SDS遵循C字符串以空字符结尾的管理,保存空字符的一个字节空间不计算在SDS的len属性里面,并且为空字符分配额外的一个字节空间,以及添加空字符到字符串末尾等操作,都是由SDS函数自动完成的。

2、SDS与C字符串的区别

2.1、获取字符串长度

C字符串获取字符串的长度时需要遍历数组,而SDS只需要访问len属性即可;设置和更新SDS长度的工作是由SDS的API在执行时自动完成的。

2.2、杜绝缓冲区溢出

C语言字符串在执行cat操作时,需要预先预留并知晓目标字符的剩余空间,若剩余空间偏小,就会溢出,覆盖内存中的其他变量。而当SDS API需要对SDS进行修改时,API会先检查SDS的空间是否满足需求,如果不满足的话,API会自动将SDS的空间扩展至需要修改的大小,然后才执行实际的修改操作。

2.3、减少修改字符串带来的内存重分配次数

这种情形发生在,对字符串的append和trim操作中。

空间预分配
当SDS扩展空间的时候,遵循以下方法:

  • [ ] 如果SDS的len小于1MB,那么程序分配和len一样大小的未使用空间。
  • [ ] 如果SDS的len大于1MB,那么圣墟会分配1MB的未使用空间。

惰性空间的释放

当SDS剩余较多空间时,并不是马上释放掉,而是暂时保留,因为将来空间也可能增长;SDS中的API会在需要的时候,释放掉多余的空间。

2.4、二进制安全

C语言字符串必须符合某种编码,并且除了字符串的末尾以外,字符串中不允许出现结尾符,所以C字符串只能保存文本文件。而SDS的API都会以处理二进制的方式来处理存放在buf数组里的数据。

2.5、兼容部分C字符串函数

SDS的字符串也是遵循空字符结尾的规则。如strcasecamp函数,strcat函数等。

3、SDS API

函数 作用 时间复杂度
sdsnew 创建一个包含给定的C字符创的SDS O(N),n为给定的C字符串的长度
sdsempty 创建一个不包含任何内容的SDS O(1)
sdsfree 释放给定的sds O(N),n为被释放的SDS长度
sdslen 返回SDS的已使用的空间字节数 O(1)
sdsavail 返回SDS的我使用空间字节数 O(1)
sdsdup 创建一个给定的SDS的副本(copy) O(N),n为给定的SDS的长度
sdsclear 清空SDS保存的字符串内容 惰性空间策略,O(1)
sdscat 将给定的C字符串拼接到SDS字符串的末尾 O(N),n为拼接C字符串的长度
sdscatsds 将给定的SDS字符串拼接到另一个SDS字符串的末尾 O(N),n为被拼接字符串的长度
sdspy 将给定的C字符串复制到SDS里面,覆盖SDS原有的字符串 O(N),n为被复制的C字符串的长度
sdsgrowzero 用空字符将SDS扩展至给定长度 O(N),n为扩展新增的字节数
sdsrange 保留SDS给定区间内的数据,不在区间的数据会被覆盖或者清除 O(N),n为被保留的字节数
sdstrim 接受一个SDS和一个C字符串作为参数,从SDS左右两端分别移除所有在C字符串中出现过的字符 O(M x N),M为SDS的长度,N为C字符串的长度
sdscmp 对比两个SDS字符串是否相同 O(N),n为较短的那个SDS的长度
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Redis SDS与C字符串区别 Redis没有直接使用C语言传统的字符串,而自己构建了一种简单动态字符串(Sim...
    binge1024阅读 5,388评论 0 0
  • 1、SDS redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dy...
    我要尝鲜阅读 2,823评论 0 1
  • Redis使用的是自己构建的简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将...
    但莫阅读 3,462评论 0 0
  • Redis没有直接使用C语言传统的字符串表示,而是构建了一种名为简单动态字符串(simple dynamic st...
    HRADPX阅读 2,972评论 0 0
  • 一、SDS介绍 Redis没有使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称C字符串),而是自己构...
    Vic_is_new_Here阅读 8,372评论 0 1

友情链接更多精彩内容