文档章节

SDS较C字符串优势

勤奋的蚂蚁
 勤奋的蚂蚁
发布于 2017/07/18 14:00
字数 522
阅读 35
收藏 0

1.获取字符串长度的复杂度

由于设置和更新SDS长度是由SDS的API在执行时自动完成,故取长度复杂度为O(1),而C字符串获取长度需要遍历整个字符串,故为O(n).

2.防止缓冲区溢出

以C字符串为例,如果将一个字符串拼接到另外一个字符串尾部,使用strcat(s1, "value"),如果在执行前未给s1分配足够空间,那么在s1修改后,会将s1的数据溢出到s2所在空间,这样就会导致s2值被意外修改.

但是SDS不会出现这种情况,因为它会自动扩展空间至修改所需大小,则不会出现溢出情况.需要注意的是使用指令sdscat(s, "value")后,假设s长度为5,则将SDS的长度修改为10,且将SDS未使用空间同样修改为10,这是SDS空间分配策略.

3.减少修改字符串时带来的内存重分配次数

SDS空间分配策略主要为空间预分配和惰性空间释放两种优化策略.

在扩展SDS空间之前,SDS API会检查未使用空间是否足够,若足够,则直接使用API,反之扩展空间,扩展时根据大小预扩展.

在缩短字符串操作时,SDS会将丢弃字符串多出来的空间留下来,用free表示大小,再次扩展时,检查free,若够则直接添加,反之再扩展.

4.二进制安全

对于C字符串来讲,无法识别空字符,就会出现"XXX YYY",只识别出了XXX;并且只能保存文本数据,不能保存图片等二进制数据.

但是对于SDS而言,由于SDS API都会以处理二进制方式处理SDS,故不会出现C字符串问题.

5.兼容C字符串

由于使用空字符串结尾,故可以使用C字符串的一些函数.

 

© 著作权归作者所有

上一篇: Redis指令
下一篇: CentOS安装JDK
勤奋的蚂蚁
粉丝 7
博文 51
码字总数 13737
作品 0
海淀
私信 提问
redis 系列3 数据结构之简单动态字符串 SDS

原文:redis 系列3 数据结构之简单动态字符串 SDS 一. SDS概述   Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型...

杰克.陈
2018/11/13
0
0
Redis源码阅读笔记-动态字符串(SDS)结构

Redis中采用自定义的结构来保存字符串,在中: SDS由4部分组成: : SDS字符串已经使用的空间(不包含C中字符串的结束符的长度1)。 : 申请的空间大小,减去len就是未使用的空间,初始时和len...

Jian_Ming
2018/09/05
38
0
redis数据结构实现--简单动态字符串

redis数据结构实现--简单动态字符串 1. SDS简单动态字符串详解 sds是redis自己实现的一种数据结构,用来作为redis底层默认字符串,与c语言的字符串区别开来。 在redis中c字符串一般用于不需要...

jackrabb1t
2018/11/20
0
0
Redis研究-1.简单动态字符串

我们知道,在C字符串中,底层的实现是使用c字符数组来实现的,但是在高性能以及内存安全方面,使用底层的c字符串是满足不了的,举个简单的例子,如果你使用strcat(s,s1)函数,如果在操作之前...

会飞的杨先生
2015/08/24
10K
7
Redis 数据结构之-简单动态字符串(SDS)

Redis采用一种名为简单动态字符串(simple dynamic string,SDS)的数据结构做为默认字符串的表示。 并且在Redis中,只有常量采用默认C语言字符串表示,如果一个字符串是可变的就会采用SDS。...

book
2016/11/18
248
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
6
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部