简单动态字符串

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

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

  客户端执行命令

    set msg "hello world"

  那么Redis将在数据库中创建一个新得键值对,其中

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

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

  又比如,客户端执行命令

    rpush fruits “apple” “banana” “cherry”

  那么Redis将在数据库中创建一个新的键值对,其中

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

     键值对的值是一个列表对象,列表对象包含了三个字符串对象,这三个字符串对象分别由三个SDS实现:第一个SDS保存着字符串“apple”,第二个SDS保存着字符串“banana”,第三个SDS保存着字符串“cherry”

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

一、SDS的定义

结构如下图

  

  free 属性的值为0,表示这个SDS没有分配任何未使用空间

  len 属性的值为5,表示这个SDS保存了一个五字节长的字符串

  buf 属性是一个char类型的数组,最后一个字节保存了空字符“\0”

  SDS遵循C字符串以空字符串结尾的惯例,保存空字符的1字节空间不计算在SDS的len属性里,并为空字符分配额外的1字节空间,以及添加空字符到字符串末尾等操作,都是由SDS函数自动完成的,所以这个空字符对于SDS的使用者来说是完全透明的。

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

    

  图2.2展示了另一个SDS实例,这个SDSbuf数组分配了5个未使用空间,free属性为5

二、SDS与C字符串区别

  传统C语言使用长度为N+1的字符数组来表示长度为N的字符串

  

  C语言使用的这种简单的字符串表示方式,并不能满足Redis对字符串在安全性、效率以及功能方面的要求。

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

  2.杜绝缓冲区溢出

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

  4.二进制安全

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

原文地址:https://www.cnblogs.com/huan30/p/12105087.html

时间: 2024-08-01 14:20:36

简单动态字符串的相关文章

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【简单动态字符串序列一】

第一章 简单动态字符串 2.1 引言 字符串String是程序设计中最为常见的一种数据结构,也是最为重要的一种数据结构,Hello World!这个最为精典的程序,是绝大部份人学习一种程序设计语言的入门程序,在这个最为精典的入门程序中,Hello World!就是字符串类型,字符串可以用于软件中信息的提醒.保存等,Redis中key都是String类型的,因此了解String类型对于我们了解Redis以及动手写Redis都是非常有益的. 2.2 字符串基本概念 以上是我们最为熟悉的Hello W

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记录

redis 简单动态字符串 SDS

redis 没有直接使用c语言传统的字符串表示,而是自己构建了简单动态字符串(SDS)的抽象类型,并将SDS用作redis的默认字符串表示 redis的数据库里面,包含字符串值的键值对在底层都是SDS实现的 执行 rpush fruits "apple" "banana" "pits" 那么redis将在数据库中创建一个新的键值对,其中: 1.键值对的键是一个字符串对象,对象的底层实现是一个保存了字符串的fruits的SDS 2.键值对的值是一个

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

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

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

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

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

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

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

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

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.re