iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis中数据结构的底层实现分析
  • 882
分享到

Redis中数据结构的底层实现分析

2024-04-02 19:04:59 882人浏览 独家记忆
摘要

Redis中数据结构的底层实现分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、概述Redis是一个开源的使用ANSI C

Redis数据结构的底层实现分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、概述

Redis是一个开源的使用ANSI C语言编写的key-value 数据库,我们可能会较为主观的认为 Redis 中的字符串就是采用了C语言中的传统字符串表示,但其实不然,Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string SDS)的抽象类型,并将SDS用作Redis的默认字符串表示:redis>SET msg "hello world"

SDS 定义:

struct sdshdr{       //记录buf数组中已使用字节的数量       //等于 SDS 保存字符串的长度       int len;       //记录 buf 数组中未使用字节的数量       int free;       //字节数组,用于保存字符串       char buf[];  }

Redis中数据结构的底层实现分析

图片来源:《Redis设计与实现》

我们看上面对于 SDS 数据类型的定义:

  •  len 保存了SDS保存字符串的长度

  •  buf[] 数组用来保存字符串的每个元素

  •  free j记录了 buf 数组中未使用的字节数量

2、与C语言相比较 

Redis中数据结构的底层实现分析

一般来说,SDS 除了保存数据库中的字符串值以外,SDS 还可以作为缓冲区(buffer):包括 AOF 模块中的AOF缓冲区以及客户端状态中的输入缓冲区。后面在介绍Redis的持久化时会进行介绍。

三、链表

1、概述

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。

链表在Redis 中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis 就会使用链表作为列表键的底层实现。

每个链表节点使用一个listnode结构表示(adlist.h/listNode):

typedef  struct listNode{         //前置节点         struct listNode *prev;         //后置节点         struct listNode *next;         //节点的值         void *value;    }listNode

链表的数据结构:

typedef struct list{        //表头节点       listNode *head;       //表尾节点       listNode *tail;       //链表所包含的节点数量       unsigned long len;       //节点值复制函数       void (*free) (void *ptr);       //节点值释放函数       void (*free) (void *ptr);       //节点值对比函数       int (*match) (void *ptr,void *key);  }list;

组成结构图

Redis中数据结构的底层实现分析

2、Redis链表特性

  •  双端:链表具有前置节点和后置节点的引用,获取这两个节点时间复杂度都为O(1)。

  •  无环:表头节点的 prev 指针和表尾节点的 next 指针都指向 NULL,对链表的访问都是以 NULL 结束。 

  •  带链表长度计数器:通过 len 属性获取链表长度的时间复杂度为 O(1)。

  •  多态:链表节点使用 void* 指针来保存节点值,可以保存各种不同类型的值。

四、字典

1、概述

字典又称为符号表或者关联数组、或映射(map),是一种用于保存键值对的抽象数据结构。字典中的每一个键 key 都是唯一的,通过 key 可以对值来进行查找或修改。C 语言中没有内置这种数据结构的实现,所以字典依然是 Redis自己构建的。

哈希表结构定义:

typedef struct dictht{       //哈希表数组       dictEntry **table;       //哈希表大小       unsigned long size;       //哈希表大小掩码,用于计算索引值       //总是等于 size-1       unsigned long sizemask;       //该哈希表已有节点的数量       unsigned long used;  }dictht

哈希表是由数组 table 组成,table 中每个元素都是指向 dict.h/dictEntry 结构,dictEntry 结构定义如下:

typedef struct dictEntry{       //键       void *key;       //值       uNIOn{            void *val;            uint64_tu64;            int64_ts64;       }v;       //指向下一个哈希表节点,形成链表       struct dictEntry *next; }dictEntry

key 用来保存键,val 属性用来保存值,值可以是一个指针,也可以是uint64_t整数,也可以是int64_t整数。

注意这里还有一个指向下一个哈希表节点的指针,我们知道哈希表最大的问题是存在哈希冲突,如何解决哈希冲突,有开放地址法和链地址法。这里采用的便是链地址法,通过next这个指针可以将多个哈希值相同的键值对连接在一起,用来解决哈希冲突。

Redis中数据结构的底层实现分析

五、跳跃表

1、概述

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表是一种随机化的数据,跳跃表以有序的方式在层次化的链表中保存元素,效率和平衡树媲美 ——查找、删除、添加等操作都可以在对数期望时间下完成,并且比起平衡树来说,跳跃表的实现要简单直观得多。

Redis 只在两个地方用到了跳跃表,一个是实现有序集合键,另外一个是在集群节点中用作内部数据结构。

Redis中跳跃表节点定义如下:

typedef struct zskiplistNode {       //层       struct zskiplistLevel{             //前进指针             struct zskiplistNode *forward;             //跨度             unsigned int span;       }level[];       //后退指针       struct zskiplistNode *backward;       //分值       double score;       //成员对象       robj *obj;  } zskiplistNode

多个跳跃表节点构成一个跳跃表:

typedef struct zskiplist{       //表头节点和表尾节点       structz skiplistNode *header, *tail;       //表中节点的数量       unsigned long length;       //表中层数最大的节点的层数       int level;  }zskiplist;
  •  header和tail指针分别指向跳跃表的表头和表尾节点;

  •  length属性记录节点的数量;

  •  level属性记录层数最高的几点的层数量;

  •  下图分别展示了完整的跳跃表和单个节点的详细结构图:

Redis中数据结构的底层实现分析

2、特性

跳表具有如下性质:

  •  由很多层结构组成

  •  每一层都是一个有序的链表

  •  最底层(Level 1)的链表包含所有元素

  •  如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。

  •  每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

六、整数集合

1、概述

《Redis 设计与实现》 中这样定义整数集合:“整数集合是集合建的底层实现之一,当一个集合中只包含整数,且这个集合中的元素数量不多时,redis就会使用整数集合intset作为集合的底层实现。”

我们可以这样理解整数集合,他其实就是一个特殊的集合,里面存储的数据只能够是整数,并且数据量不能过大。

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

我们观察一下一个完成的整数集合结构图: 

Redis中数据结构的底层实现分析

  • encoding:用于定义整数集合的编码方式

  • length:用于记录整数集合中变量的数量

  • contents:用于保存元素的数组,虽然我们在数据结构图中看到,intset将数组定义为int8_t,但实际上数组保存的元素类型取决于encoding

2、特性

  •  整数集合是集合建的底层实现之一

  •  整数集合的底层实现为数组,这个数组以有序,无重复的范式保存集合元素,在有需要时,程序会根据新添加的元素类型改变这个数组的类型

  •  升级操作为整数集合带来了操作上的灵活性,并且尽可能地节约了内存2

  整数集合只支持升级操作,不支持降级操作

七、压缩列表

1、概述

压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,那么Redis 就会使用压缩列表来做列表键的底层实现。

一个压缩列表的组成如下:

Redis中数据结构的底层实现分析

  •  zlbytes:用于记录整个压缩列表占用的内存字节数

  •  zltail:记录要列表尾节点距离压缩列表的起始地址有多少字节

  •  zllen:记录了压缩列表包含的节点数量

  •  entryX:要说列表包含的各个节点

  •  zlend:用于标记压缩列表的末端

2、特性

  •  压缩列表是一种为了节约内存而开发的顺序型数据结构

  •  压缩列表被用作列表键和哈希键的底层实现之一

  •  压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值

  •  添加新节点到压缩列表,可能会引发连更新操作。 

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: Redis中数据结构的底层实现分析

本文链接: https://www.lsjlt.com/news/57989.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis中数据结构的底层实现分析
    Redis中数据结构的底层实现分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、概述Redis是一个开源的使用ANSI C...
    99+
    2024-04-02
  • 怎么进行Redis数据结构底层实现
    这篇文章将为大家详细讲解有关怎么进行Redis数据结构底层实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。面试中,redis也是很受面试官亲睐的一部分。我...
    99+
    2024-04-02
  • redis五种数据结构的底层实现方法
    本篇内容主要讲解“redis五种数据结构的底层实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis五种数据结构的底层实现方法”吧!实现方法:1、每种数据结构都有自己底层的内部编码实现...
    99+
    2023-06-20
  • Redis底层数据结构详解
    Redis作为Key-Value存储系统,数据结构如下: Redis没有表的概念,Redis实例所对应的db以编号区分,db本身就是key的命名空间。 比如:user:1000作为...
    99+
    2024-04-02
  • Redis的六种底层数据结构(小结)
    目录1、简单动态字符串(SDS)2、链表3、字典哈希表哈希表节点字典4、跳跃表跳跃表节点(zskiplistNode)跳跃表(zskiplist)5、整数集合6、压缩列表1、简单动态...
    99+
    2024-04-02
  • 分布式架构Redis中有哪些数据结构及底层实现原理
    目录引言1、面试官:我看你提到,项目中使用了Reids作为缓存,为什么是Reids而不是其他,Redis有什么优势吗?2、面试官:刚刚你提到Redis是单线程,为什么单线程模型的 R...
    99+
    2024-04-02
  • redis底层数据结构如何优化
    Redis底层数据结构的优化主要有以下几个方面:1. 字符串类型的优化:Redis中的字符串类型是基于sds(simple dyna...
    99+
    2023-08-24
    redis
  • Redis的底层数据结构有多少种
    小编给大家分享一下Redis的底层数据结构有多少种,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、简单动态字符串(SDS)Redis 虽然是用 C 语言写的,但Redis没有直接使用C语言传统的字符串表示(以空字符 &a...
    99+
    2023-06-22
  • Redis的六种底层数据结构是什么
    本篇内容介绍了“Redis的六种底层数据结构是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、简单动...
    99+
    2024-04-02
  • Redis 哈希Hash底层数据结构详解
    目录1. Redis 底层数据结构2. hashtable3. redisDb 与 redisObject4. ziplist5. linkedlist6. quicklist1. ...
    99+
    2022-11-13
    redis中hash的底层 Redis底层数据结构 Redis中Hash数据结构的底层结构
  • mysql底层数据结构
    mysql索引是为了快速查找数据而把数据按照一定规则排列的数据结构 查看数据结构地址:Data Structure Visualization 一、索引数据结构分类 1、无索引查找 普通的查找就是通过全表扫描,数据存储在磁盘上的位置是随机的...
    99+
    2023-09-05
    数据库
  • java中hashmap的底层数据结构与实现原理
    目录Hash结构HashMap实现原理为何HashMap的数组长度一定是2的次幂?重写equals方法需同时重写hashCode方法总结Hash结构 HashMap根据名称可知,其实...
    99+
    2024-04-02
  • redis各种数据类型底层数据存储结构
    redis 的数据类型使用不同的底层存储结构:字符串:简单动态字符串(sds)哈希:哈希表,使用链表或跳跃表处理哈希碰撞列表:双向链表集合:哈希表或整数集合,使用布隆过滤器有序集合:跳跃...
    99+
    2024-04-19
    redis
  • Redis底层数据结构之dict、ziplist、quicklist详解
    目录1 Redis dict1.1 扩缩容的条件1.2 渐进式rehash操作2 Redis ziplist2.1 ziplist结构 2.2 entry结构3 Redis...
    99+
    2024-04-02
  • 如何实现Python底层技术的数据结构
    如何实现Python底层技术的数据结构数据结构是计算机科学中非常重要的一部分,它用于组织和存储数据,以便能够高效地操作和访问数据。Python作为一种高级编程语言,提供了丰富的内置数据结构,如列表、元组、字典等,但有时候我们也需要实现一些底...
    99+
    2023-11-09
    技术实现 底层实现 Python数据结构
  • C语言数据结构之vector底层实现机制解析
    目录一、vector底层实现机制刨析二、vector的核心框架接口的模拟实现1.vector的迭代器实现2.reserve()扩容3.尾插尾删(push_back(),pop_bac...
    99+
    2024-04-02
  • redis的五种数据类型底层数据结构是什么
    redis 提供了五种数据类型,每种类型对应特定的底层数据结构:字符串:简单动态字符串(sds),优化二进制安全字符串存储。哈希:哈希表(dict),快速键值对存储。列表:双向链表或压缩...
    99+
    2024-04-08
    键值对
  • 深入剖析Golang切片:底层数据结构及实现方式
    Golang切片原理解析:底层数据结构及实现方式 引言: 在Golang中,切片(Slice)是一种非常常用的数据结构。它提供了一种便捷的方式来操作连续的元素序列。切片背后的设计和实现隐藏了很多细节,在使用切...
    99+
    2024-01-24
    Golang 切片
  • PHP底层的高性能数据结构与实现方法
    PHP底层的高性能数据结构与实现方法,需要具体代码示例随着互联网应用的不断发展,PHP已经成为了一种广泛使用的服务器端脚本语言。然而,在大规模的Web应用中,PHP的性能问题成为了一个不容忽视的问题,很多大型网站都出现了性能瓶颈和系统崩溃的...
    99+
    2023-11-09
    数据结构 高性能 PHP底层
  • 揭秘 Python 数据结构的实现:从底层到表面
    ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作