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

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

1. 简单动态字符串:

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

struct sdshdr {

    // buf 中已占用空间的长度
int len; // buf 中剩余可用空间的长度
int free; // 数据空间
char buf[];
};

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. Scala实践9

    1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...

  2. 聊聊HTTP请求那一些事_HttpWebRequest_一篇就够了

    ​最近工作比较忙,很久没有写东西了,今天抽点时间整体一下最近工作的一个知识点小结.http请求对我们来说一点都不模式,程序员的我们有可能天天就是和这一些打交道.无论是BS架构的程序,前后端的数据交互, ...

  3. 死磕面试 - Dubbo基础知识37问(必须掌握)

    作为一个JAVA工程师,出去项目拿20k薪资以上,dubbo绝对是面试必问的,即使你对dubbo在项目架构上的作用不了解,但dubbo的基础知识也必须掌握. 整理分享一些面试中常会被问到的dubbo基 ...

  4. Thematic002.字符串专题

    目录 Trie字典树 KMP AC自动机 Manacher 回文自动机 后缀数组 后缀自动机 Trie字典树 概念 我们先来看看什么是Trie字典树 可以发现,这棵树的每一条边都有一个字符 有一些点是 ...

  5. 使用Async方法 Using Async Methods 精通ASP-NET-MVC-5-弗瑞曼 Listing 4-32.

  6. 改进Zhang Suen细化算法的C#实现

    本文主要实现了改进Zhang Suen细化算法的C#实现,相关论文 :“牟少敏,杜海洋,苏平,查绪恒,陈光艺.一种改进的快速并行细化算法[J].微电子学与计算机,2013,(第1期)” .这篇论文中关 ...

  7. JS-04-流程控制和循环

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Static、Final、static final

    Static.Final.static final final可以修饰:属性,方法,类,局部变量(方法中的变量) 用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值. ...

  9. ios---cocoapods 安装与使用 (AFNetworking为例)

    cocoapods 安装与使用 一.CocoaPods是什么? CocoaPods是一个用Ruby写的.负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中的.统一管理第三方开源库, ...

  10. JDK源码之String类解析

    一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以 ...