本文为读《Redis设计与实现》的记录。该书以Redis2.9讲解Redis相关内容。请注意版本差异。


  Redis使用C语言实现,他对C语言中的char类型数据进行封装,构建了一种简单动态字符串(以下简称SDS),该字符串的结构如下

struct sdshdr{
  //记录buf数组中已使用字节的数量
  //获取字符串的长度时,就是直接返回的这个字段的值
  int len;
//记录buf数组中未使用字节的数量
  int free;
  //字节数组,用于保存字符串
  char buf[];
}

  SDS遵循C语言中,字符串以空字符结尾的惯例。该空字符会在buf[]中占一位,但是不会统计到字符串长度 len中,这个空字符对于编程者来说,是透明的。

  如Redis在SDS中存储的方式可能为

    len = 5;

    free = 0;

    buf = {'R','e','d','i','s','\0'}

  free是指buf中的预留长度。他的值遵循以下三种规则

  1) buf数组删除掉一部分时,buf的长度不会立即改变,删除的长度会先累加进free的值中。

  2) buf数组新增一部分时,若free的值大于新增的长度,则free减去新增的长度,若free小于新增的长度,则对buf进行扩容,free = len + 新增的长度 ,buf = 2 * free + 1,加的1是'\0' 空字符的值

  3) free的最大值不超过1M

  总结:SDS的扩容遵循了类似于hashMap扩容的*2规则,通过增加空间复杂度,减少了时间复杂度,空间最大的花费忍耐度是1M。

  SDS与C语言中的普通字符串的一个大的区别是:SDS允许字符串的中间出现空字符。SDS字符串的结束标识是根据len的大小来进行判断的,末尾额外的增加一个空字符,只是为了使用一部分C语言中提供的API。这样,SDS就可以储存一些图像、音频、视频、压缩文件这样的二进制数据。而C语言中的一般字符串遇到空字符就判断字符串结束。无法存储这些二进制文件。


  总的来说,SDS的优点如下:

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

  2) 杜绝缓冲区溢出

  3) 减少修改字符串时所需的内存分配次数

  4) 二进制存储安全

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

小白的Redis学习(一)-SDS简单动态字符串的更多相关文章

  1. Redis数据类型之SDS简单动态字符串

    一,简单的动态字符串 1,Redis自己构建了一种名为简单动态字符串的抽象类型,并将SDS用作Redis的默认字符串表示, 2,在redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的 ...

  2. redis 学习笔记二 (简单动态字符串)

    redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...

  3. 图解Redis之数据结构篇——简单动态字符串SDS

    图解Redis之数据结构篇--简单动态字符串SDS 前言     相信用过Redis的人都知道,Redis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用.这个对象系统包括字符串对象 ...

  4. 1.redis设计与实现--简单动态字符串

    1.redis没有使用c语言的字符串表示,而是使用更加适合自己的SDS(simple dynamic string),简单动态字符串,结构如下: 2.sys与c字符串的对比: 3.总结: redis采 ...

  5. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

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

    1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制 ...

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

    * 1024 , 也就是说. 当大小小于 1MB 的字符串运行追加操作时,sdsMakeRoomFor 就为它们分配多于所需大小一倍的空间: 当字符串的大小大于 1MB . 那么 sdsMakeRoo ...

  8. Redis—简单动态字符串(SDS)

    目录 Redis-简单动态字符串(SDS) SDS的定义 SDS与C字符串的区别 1. 常数复杂度获取字符串长度: 2. 杜绝缓冲区溢出: 3. 减少修改字符串时带来的内存重分配次数 4. 二进制安全 ...

  9. Redis的简单动态字符串实现

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

随机推荐

  1. Ubuntu16.04 使用sudo cat EOF 编辑文件,提示Permission denied错误的解决办法

    一.执行命令报错 在Ubuntu16.04下,使用如下命令,修改hosts主机文件,居然提示权限错误: catty@node186:~$ sudo cat <<EOF > /etc/ ...

  2. [Windows]卸载Office 2016密钥

    cscript "C:\Program Files (x86)\Microsoft Office\Office16\ospp.vbs" /dstatus BTDRB

  3. VUE 创建element项目

    前提:电脑安装git node.js 一.右键Git Bash Here 二.$ vue init webpack element //新建一个element项目,element是文件夹名字 $ cd ...

  4. Log4Net 常见格式说明(不断更新中)

    用户名  %username pc版本 另起一行 %newline

  5. Postman中x-www-form-urlencoded请求K-V的ajax实现

    在Postman中使用x-www-form-urlencoded,并且用K-V传值,但是在代码中用ajax来请求,传值一直有问题,静下心来思考才发现K-V传入的是string,所以记录下来以防忘记!! ...

  6. bom头

    最近做ecshop经常碰到bom头问题,具体表现用chrome开发工具查看会出现小红点, 具体删除办法见网上,我是用老文件copy再替换内容.

  7. springMVC的配置与使用

    springMVC的配置与使用 spring mvc 核心类与接口 先来了解一下,几个重要的接口与类.现在不知道他们是干什么的没关系,先混个脸熟,为以后认识他们打个基础. DispatcherServ ...

  8. css--样式表的引入方法

    html引用css方法如下1.直接在div中使用css样式(内链)2.html中使用style自带式(嵌入)3.使用@import引用外部CSS文件(外部引入)4.使用 link引用外部CSS文件 推 ...

  9. css给html添加效果

    <!doctype html> <html> <head> <title>EasyMall注册界面</title> <meta htt ...

  10. 构建web应用之——文件上传

    我们通过使用multipart请求数据接收和处理二进制信息(如文件).DispatcherServlet并没有实现任何解析multipart请求数据的功能,它将该任务委托给了Spring中的multi ...