redis内部数据结构,是指redis在自身的构建中,基于这些特定的内部数据结构进行的。

  1. 简单动态字符串:Simple Dynamic String
  2. 双端链表
  3. 字典:Dictonary
  4. 跳跃表:skipList
  • 简单动态字符串


    • 用途

      • 实现字符串对象(StringObject);
      • 在 Redis 程序内部用作 char* 类型的替代品;
    • 数据结构
      • typedef char *sds;
        
        struct sdshdr {
        
            // buf 已占用长度
        int len; // buf 剩余可用长度
        int free; // 实际保存字符串数据的地方
        char buf[];
        };
    • 总结
      • Redis 的字符串表示为 sds ,而不是 C 字符串(以 \0 结尾的 char*)。
      • 对比 C 字符串, sds 有以下特性:
        • 可以高效地执行长度计算(strlen);
        • 可以高效地执行追加操作(append);
        • 二进制安全;
      • sds 会为追加操作进行优化:加快追加操作的速度,并降低内存分配的次数,代价是多占用了一些内存,而且这些内存不会被主动释放。
  • 双端链表


    双端链表作为一种通用的数据结构, 在 Redis 内部使用得非常多: 既是 Redis 列表结构的底层实现之一, 同时为大量 Redis 模块所用, 用于构建 Redis 的其他功能。

    • 用途

      • 实现 Redis 的列表类型

      • Redis 自身功能的构建
        • 除了实现列表类型以外, 双端链表还被很多 Redis 内部模块所应用:

        • 事务模块使用双端链表依序保存输入的命令;
        • 服务器模块使用双端链表来保存多个客户端;
        • 订阅/发送模块使用双端链表来保存订阅模式的多个客户端;
        • 事件模块使用双端链表来保存时间事件(time event);
    • 数据结构
      • 图:

  • typedef struct listNode {
    
        // 前驱节点
    struct listNode *prev; // 后继节点
    struct listNode *next; // 值
    void *value; } listNode; typedef struct list { // 表头指针
    listNode *head; // 表尾指针
    listNode *tail; // 节点数量
    unsigned long len; // 复制函数
    void *(*dup)(void *ptr);
    // 释放函数
    void (*free)(void *ptr);
    // 比对函数
    int (*match)(void *ptr, void *key);
    } list
    • Redis 实现了自己的双端链表结构。
    • 双端链表主要有两个作用:
      • 作为 Redis 列表类型的底层实现之一;
      • 作为通用数据结构,被其他功能模块所使用;
    • 双端链表及其节点的性能特性如下:
      • 节点带有前驱和后继指针,访问前驱节点和后继节点的复杂度为 O(1) ,并且对链表的迭代可以在从表头到表尾和从表尾到表头两个方向进行;
      • 链表带有指向表头和表尾的指针,因此对表头和表尾进行处理的复杂度为 O(1) ;
      • 链表带有记录节点数量的属性,所以可以在 O(1) 复杂度内返回链表的节点数量(长度);
  • 总之
  • 字典

  • 跳跃表


redis内部数据结构的更多相关文章

  1. [转]Redis内部数据结构详解-sds

    本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...

  2. Redis学习笔记-Redis内部数据结构

    Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...

  3. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  4. 探索Redis设计与实现7:Redis内部数据结构详解——intset

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  5. 探索Redis设计与实现5:Redis内部数据结构详解——quicklist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  6. 探索Redis设计与实现4:Redis内部数据结构详解——ziplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  7. 探索Redis设计与实现3:Redis内部数据结构详解——sds

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  8. 探索Redis设计与实现2:Redis内部数据结构详解——dict

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  9. 【转】Redis内部数据结构详解——ziplist

    本文是<Redis内部数据结构详解>系列的第四篇.在本文中,我们首先介绍一个新的Redis内部数据结构--ziplist,然后在文章后半部分我们会讨论一下在robj, dict和zipli ...

随机推荐

  1. linux tcp调优

    Linux TCP Performance Tuning News Linux Performance Tuning Recommended Books Recommended Links Linux ...

  2. Python 小知识点(10)--异常结构记录

    try: print("try中") except KeyError as e: # 异常时,执行该块 print("异常中") else: # 主代码块(tr ...

  3. GeoServer之styles定制

    GeoServer之styles定制 GeoServer中styles类似于css,将地图中的点线面画出一层皮肤,引用在图层上.不同的地方在于.GeoServer中的styles用的是sld语法,也就 ...

  4. e s6 知识点

    http://es6.ruanyifeng.com/#docs/reflect 1.资料对es6箭头函数中的this总结:箭头函数中的this指向的是 定义时的this,而不是 执行时的this.

  5. Cookie&Session会话跟踪技术

    今日内容学习目标 可以响应给浏览器Cookie信息[response.addCookie()] 可以接受浏览器Cookie信息[request.getCookies()] [创建cookie,设置pa ...

  6. 如何建立ElasticSearch里的mappings?

    刚接触elasticsearch,好多东西都不会用,百度了很多,都看不懂,终于摸索出了最简单的通过http建立mappings的方法~ 有人在建立mappings报各种错误,首先,如果你的这个索引中已 ...

  7. 后端生成二维码 - C#生成二维码(QR)

    最近在github上找到一个相对比较好的C#二维码生成类库.在这里和大家分享一下. github地址:https://github.com/codebude/QRCoder 把解决方案下载下来,编译生 ...

  8. Linux运维基础入门(一)网络基础知识梳理01

    一,计算机网络参考模型 1.1 OSI七层模型 1)物理层 主要功能是完成相邻节点之间原始比特流的传输.(网卡等) 物理层协议关心的典型问题是使用什么样的物理信号来表示数据1和0:持续的时间有多长:数 ...

  9. java算法 第七届 蓝桥杯B组(题+答案) 8.四平方和

    8.四平方和  (程序设计) 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + ...

  10. 117 FP页面无法查看 此错误是JDK8.0.0.0版本的一个BUG,会导致工单重复回写,

    用户表示117 FP页面无法查看,提示如下错误: 跟进: 1.进入FP服务器可看到以下错误 这个错误的框就表示FP的一个进程报错,自动断掉了,需要重新跑一次EXIT,INIT,PLAN,EXPORT, ...