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. DataGrid——行高不起作用

    问题1:rowStyler 设置行高不起作用: 在 DataGrid 组件中,提供了 rowStyler 函数,用于设置行的css 样式,但是实践发现,对于height设置不起作用.跟踪代码发现如下: ...

  2. LinearLayout布局

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  3. Dijkstra 调度场算法 Python实现 一

    调度场算法(Shunting Yard Algorithm)是一个用于将中缀表达式转换为后缀表达式的经典算法,由 Edsger Wybe Dijkstra 引入,因其操作类似于火车编组场而得名.  — ...

  4. PHP 数据集循环

    循环 $rs = $bbs->query("select top 10 * from tt"); while($row = $rs->fetch()) { //prin ...

  5. 跟着太白老师学python day10 名称空间,作用域和取值顺序,变量的加载顺序

    名称空间分为3种: 1. 全局名称空间 2. 内置名称空间 3. 局部名称空间(临时) 作用域 全局作用域              1全局名称空间 2 内置名称空间 局部作用域           ...

  6. 我的Linux之路——实现虚拟机VMware上linux与windows互相复制与粘贴

    出自:http://blog.csdn.net/u012243115/article/details/40454063 解决方法:只需要在CentOS安装一个vmware-tools的工具. 1.打开 ...

  7. [Python Study Notes]pynput实现对鼠标控制

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  8. pip / conda 导出和安装环境组件 requirements.txt

    pip 批量导出包含环境中所有组件的requirements.txt文件 pip freeze > requirements.txt pip 批量安装requirements.txt文件中包含的 ...

  9. Build/Run Instructions for Codec Engine Examples

    General Information This page explains how to build the examples provided in the Codec Engine (CE) p ...

  10. java算法 第七届 蓝桥杯B组(题+答案) 10.压缩变换

    10.压缩变换  (程序设计) 小明最近在研究压缩算法.他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比.然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些 ...