加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

简单动态字符串SDS

发布时间:2021-05-05 11:27:15 所属栏目:动态 来源:互联网
导读:is使用C语言开发,但并没有使用C语言传统的字符串表示(以空字符结尾的字节数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串的(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。 在Redis里面,C字符串只会作为字符

is使用C语言开发,但并没有使用C语言传统的字符串表示(以空字符结尾的字节数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串的(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。

在Redis里面,C字符串只会作为字符串字面量(static literal)用在一些无须对字符串值进行修改的地方。当Redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串值,比如在Redis的数据库里面,包含字符串的键值对在底层都是由SDS实现的。

咱们来举个例子,如果在客户端执行命令Redis将在数据库中创建一个新的键值对,其中:

键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串“msg”的SDS。

键值对的值也是一个字符串对象,对象的底层实现是一个保存着字符串“hello world”的SDS。

除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区:AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SDS实现的。总之,SDS是Redis的最基础也是最重要的数据结构。

1.SDS的定义

每个 sds.h/sdshdr 结构表示一个SDS值:字符串以空字符结尾的惯例, 保存空字符的 1字节空间不计算在 SDS 的 len 属性里面, 并且为空字符分配额外的 1 字节空间, 以及添加空字符到字符串末尾等操作都是由 SDS 函数自动完成的, 所以这个空字符对于 SDS 的使用者来说是完全透明的。

2.SDS与C字符串的区别

现在来说,C语言使用长度为N+1的字符数组来表示长度为N的字符串,并且字符数组的***一个元素总是空字符“”。

C的这种简单的字符串表达方式,并不能满足Redis对字符串在安全性、效率以及功能方面的要求。具体有以下几个方面。

2.1 常数复杂度获取字符串长度

因为C字符串并不记录字符串的长度信息,所以为了获取一个C字符串的长度,程序必须遍历整个字符串,对遇到的每个字符进行计数,直到遇到空字符为止,这个操作的复杂度为O(n)。而在Redis的SDS中,这个时间复杂度只有O(1)。

2.2 杜绝缓冲区溢出

除了获取字符串长度的复杂度高之外,C字符不记录自身长度带来的另一个问题就是缓冲区溢出。举个例子,C语言的 strcat 函数可以将字符串中的内容拼接到 dest 字符串的末尾,但是当字符串的容量不够就会产生缓存区溢出,因为字符串也是基于数组实现的,也是有大小限制的。

Redis的SDS已经杜绝了这个问题,那它是如何解决的呢?

当API要对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的空间,如果不够的话,API会自动将SDS的空间进行扩容,然后才执行实际的修改操作。这就避免了缓冲区内存溢出。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读