本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz)

redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值对(key-value)中的值(value),键的数据类型主要是字符串。

1. 简单动态字符串:

redis没有使用C的字符串,而是自己定义了数据结构来实现字符串,主要实现在sds.h和sds.c里,主要结构是下面的sdshdr。

  1. struct sdshdr {
  2.  
  3. // buf 中已占用空间的长度
  4. int len;
  5.  
  6. // buf 中剩余可用空间的长度
  7. int free;
  8.  
  9. // 数据空间
  10. char buf[];
  11. };

sds字符串实现的优点:

- 传统C语言的字符串长度获取的复杂度为o(N), 用sdshdr.len可以将复杂度降为o(1)

- 因为C语言的字符串不自带长度信息,进行字符串的扩充/拷贝操作时,容易产生溢出,而sds的实现,因为有len和free两个变量来记录空间信息,那么在比如sdscat(类似strcat)的实现里,会先判断sdshdr.free是否足够给新的字符串,如果不够,会先申请新的空间(sdsMakeRoomFor()),这样保证了不会有溢出

- C语言的字符串操作,如果要做扩充/截断操作,是需要重新分配/扩展/释放内存,再进行老的字符串到新字符串的内存迁移操作,对于redis这样对速度要求高的数据库,频繁的内存分配/释放操作对性能有影响,所以通过利用sdshdr.len和sdshdr.free,可以进行优化,具体为空间预分配和惰性空间释放两个优化策略:

a.空间预分配:实现在sdsMakeRoomFor(),当用这个函数给某个sdshdr分配新的空间时,它不仅分配需要的空间,还会多分配额外空间,具体为: 1.如果字符串操作结束后,新的sdshdr.len小于1MB,那么sdshdr.free也分配同样大小的长度;2.如果字符串操作结束后,新的sdshdr.len大于1MB,那么分配1MB的free空间,具体举例和sdsMakeRoomFor()中相关实现如下:

b.惰性空间释放:当SDS的字符串缩短时,空出来的内存不进行释放,而是计入sdshdr.free里,等待将来使用

- 二进制安全:依赖于sdshdr.len,我们可以用SDS的buf保存各种二进制数据,比如图片,音频等,

- 兼容部分C的字符串函数: SDSHDR的buf里其实存的就是字符串,然后通过len和free进行方便的控制,而SDS里存的内容还是遵循以空字符结尾的C语言管理,所以对sdshdr.buf,可以用C的字符串函数进行调用。

总结:

[redis读书笔记] 第一部分 数据结构与对象 简单动态字符串的更多相关文章

  1. [redis读书笔记] 第一部分 数据结构与对象 对象类型

    - 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...

  2. [REDIS 读书笔记]第一部分 数据结构与对象 跳跃表

    下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://ken ...

  3. [redis读书笔记] 第一部分 数据结构与对象 对象特性

    一 类型检查和多态    类型检查,即有的命令是只针对特定类型的,如果类型不对,就会报错,此处的类型,是指的键类型,即robj.type.下面为有类型检查的命令: 对于某一种类型,redis下底层的实 ...

  4. [redis读书笔记] 第一部分 数据结构与对象 字典

    三 字典 字典是Hash对象的底层实现,比如用HSET创建一个HASH的对象,底层可能就是用一个字典实现的键值对. 字典的实现主要设计下面三个结构: /* * 哈希表节点 */ typedef str ...

  5. [redis读书笔记] 第一部分 数据结构与对象 整数集合

    typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t c ...

  6. [redis读书笔记] 第一部分 数据结构与对象 压缩列表

    压缩列表是为了节省内存而设计的,是列表键和哈希键的底层实现之一. 压缩列表的逻辑如下,

  7. [redis读书笔记] 第一部分 数据结构与对象 链表

    二 链表 1.链表节点使用ListNode结构,是一个双向的链表,同时,还实现了一个控制所有ListNode的结构list: typedef struct listNode { // 前置节点 str ...

  8. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  9. Redis(一):数据结构与对象

    前言 本书是Redis设计与实现的读书笔记,旨在对Redis底层的数据结构及实现有一定了解.本书所有的代码基于Redis 3.0. 简单动态字符串 SDS Redis没有直接使用C语言中的字符串,而是 ...

随机推荐

  1. Spring Boot2 系列教程(二十) | SpringBoot 是如何实现日志的?

    微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 休息日闲着无聊看了下 SpringBoot 中的日志实现,把我的理解跟大家说下. 门面模式 说到日志框架不得不说门面模式.门面 ...

  2. aliPayPlus 科普使用

    本文出自APICloud官方论坛, 感谢论坛版主City7的分享. 首先到 https://open.alipay.com/platform/manageHome.htm 申请应用上线 支付宝网关:这 ...

  3. 解决a 标签 和 div 标签高度超出的问题

    当a,或div标签里面有内容时,有时候a 或div的高度会超出,此时可以设置a或div的font-size:0:

  4. 第一个javaWeb项目-注册界面

    基本功能: 实现信息录入到数据库和信息规范检查 题目要求: 项目目录: 网页界面: 程序源码: package Dao; import java.sql.Connection; import java ...

  5. Nginx的踩坑实录

    1.昨天在为一个新项目配置地址转发,搞了很久都没生效,日志也没有问题,但就是没到转发的目标机器上. nginx.conf 配置如下: location /prism{ proxy_pass http: ...

  6. Java入门 - 高级教程 - 03.泛型

    原文地址:http://www.work100.net/training/java-generic.html 更多教程:光束云 - 免费课程 泛型 序号 文内章节 视频 1 概述 2 泛型方法 3 泛 ...

  7. [洛谷P4707] 重返现世

    Description 为了打开返回现世的大门,\(Yopilla\) 需要制作开启大门的钥匙.\(Yopilla\) 所在的迷失大陆有 \(n\) 种原料,只需要集齐任意 \(k\) 种,就可以开始 ...

  8. set(待整理)

    set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...

  9. lind 语 api 数据的安全性  第四弹

    web api的安全性怎么保证呢. 一般公司会自己封装一套请求的规范. 下面来看看lind语里的webapi安全规范 step one 先看下 diagram: 学而思: 从上面的图分析一下: 如果我 ...

  10. Java 8 Stream流编程学习

    本文是自己学习菜鸟教程中总结的笔记,用于快速找代码,完整的文档见菜鸟教程:Java 8 Stream Stream 使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达 ...