redis数据结构-SDS简单动态字符串

一.使用场景

redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是构建了简单动态字符串(Simple dynamic String SDS)的抽象类型,并将SDS作为默认的字符串表示形式。

redis里面C字符串只用在字符串字面量(String literal) ,用在一些无需对字符串修改的地方。

比如打印日志redisLog(REDIS_WARING,"redis is now ready to exit, bye bye...")

1.redis需要的不仅仅是一个字符串字面量,而是一个可修改的字符串值时,redis就会使用SDS来表示字符串值,比如在redis数据库里面,包含字符串值的键值对在底层都是由SDS实现的。

2.SDS还被用作缓冲区:AOF模式中的缓冲区,以及客户端状态中的输入缓冲区,都是SDS实现的。

二.定义

1.每一个sds.h/sdshdr结构表示SDS的值

struct sdshdr {

//记录buf数组中已使用的字节数量

//等于SDS所保存的字符串长度

int len;

//记录buf数组中未使用的字节数量

int free;

//字节数组,用于保存字符串

char buf[];

}

free为0,表示SDS没有分配任何未使用空间

len =5,表示SDS保存了5字节长度的字符串

buf 是一个char类型的数组,数组的前五个字节分别保存了 ‘r‘,‘e‘,‘d‘,‘i‘,‘s‘  五个字符,最后一个字节则表示了空字符‘\0‘

SDS遵循了C字符串以空字符结尾的惯例,保存空字符串的1个字节空间,不计算在SDS的属性里面,并且为控制符串分配额外的1字节空间,

以及添加空字符到字符串末尾等操作,都是有SDS自动完成的,所以这个空字符对于SDS使用者是完全透明的,

遵循空字符结尾这一惯例的好处是,SDS可以重用一部分C字符串函数库里的函数。

图2-2,展示了buf数组分配了5个未使用空间的字节,所以 free=5;

三.SDS和C字符串区别

1.常数复杂度获取字符串长度

2.杜绝缓冲区溢出

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

4.二进制安全

5.兼容部分C字符串函数

四.总结

五.SDS API

六.重点回顾

原文地址:https://www.cnblogs.com/weihl/p/12019273.html

时间: 2024-08-24 14:31:15

redis数据结构-SDS简单动态字符串的相关文章

Redis数据结构之简单动态字符串SDS

Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话,是远远不足以应对面试提问的.本文简单介绍了Redis底层最重要的数据结构 - 简单动态字符串(SDS) Redis使用C语言开发,但并没有使用C语言传统的字符串表示(以空字符结尾的字节数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串的(simple dynamic string,SDS

Redis数据结构之简单动态字符串

Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将SDS用作Redis的默认字符串表示.在Redis中,C字符串只会作为字符串字面量,用在一些无需对字符串值进行修改的地方,例如打印日志. 一.SDS的结构定义 示例: 二.SDS与C字符串的区别1. 常数复杂度获取字符串长度C字符串长度计算:遍历整个字符串直至遇到代表字符串结尾的空字符,时间复杂度为O(N).SDS长

Redis 数据结构之简单动态字符串SDS

几个概念1:key对象 数据库存储键值对的键,总是一个字符串对象.2:value对象 数据库存储键值对的值,可以是字符串对象,list对象,hash对象,set对象,sorted set对象.     例如:            set msg "hello world" 则redis在数据库中创建一个新的键值对,键和值都是一个字符串对象,底层实现都是一个sds对象.            rpush fruits "apple" "banana&quo

关于redis中SDS简单动态字符串

1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制数据. sds的类型定义 typedef char *sds; 肯定有人感到困惑了,竟然sds就等同于char *? sds和传统的C语言字符串保持类型兼容,因此它们的类型定义是一样的,都是char *,在有些情况下,需要传入一个C语言字符串的地方,也确实可以传入一个sds. 但是sds和char

小白的Redis学习(一)-SDS简单动态字符串

本文为读<Redis设计与实现>的记录.该书以Redis2.9讲解Redis相关内容.请注意版本差异. Redis使用C语言实现,他对C语言中的char类型数据进行封装,构建了一种简单动态字符串(以下简称SDS),该字符串的结构如下 struct sdshdr{ //记录buf数组中已使用字节的数量 //获取字符串的长度时,就是直接返回的这个字段的值 int len; //记录buf数组中未使用字节的数量 int free; //字节数组,用于保存字符串 char buf[]; } SDS遵循

sds(简单动态字符串) 内存预分配优化策略

在眼下版本号的 Redis 中, SDS_MAX_PREALLOC 的值为 1024 * 1024 , 也就是说. 当大小小于 1MB 的字符串运行追加操作时,sdsMakeRoomFor 就为它们分配多于所需大小一倍的空间: 当字符串的大小大于 1MB . 那么 sdsMakeRoomFor 就为它们额外多分配 1MB 的空间. 运行过 APPEND 命令的字符串会带有额外的预分配空间. 这些预分配空间不会被释放. 除非该字符串所相应的键被删除, 或者等到关闭 Redis 之后, 再次启动时又

Redis底层探秘(一):简单动态字符串(SDS)

redis是我们使用非常多的一种缓存技术,他的性能极高,读的速度是110000次/s,写的速度是81000次/s.这么高的性能背后,到底是怎么样的实现在支撑,这个系列的文章,我们一起去看看. redis的底层数据结构有以下7种,包括简单动态字符串(SDS),链表.字典.跳跃表.整数集合.压缩列表.对象.今天我们一起看下简单动态字符串(simple dynamic string),后面的文章以SDS简称. SDS简介 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称

Redis数据结构(一)简单动态字符串

Redis的字符串采用的是自定义的struct,名字叫做简单动态字符串(simple dynamic string,SDS). 结构如下: struct sdshdr{ int len; int free; char buf[]; }; 采用如此结构的好处是: [1]获取length的时候复杂度为O(1),不需要O(n): [2]动态分配空间,避免缓冲区溢出,避免每次修改或者append都重新分配: [3]二进制安全: 关于第一点显而易见,第二点,为了减少修改字符串带来的内存重分配次数,redi

Redis源码解析01: 简单动态字符串SDS

Redis没有直接使用C字符串(以'\0'结尾的字符数组),而是构建了一种名为简单动态字符串( simple  dynamic  string, SDS)的抽象类型,SDS设计API实现对字符串的各种修改. 1:SDS的定义 在sds.h中,定义了结构体sdshdr表示SDS,其定义如下: struct sdshdr { unsigned int len; unsigned int free; char buf[]; }; len记录SDS保存的字符串的长度(不包括末尾的'\0'):free记录