Redis学习笔记(四) 跳跃表与整数集合[通俗易懂]

Redis学习笔记(四) 跳跃表与整数集合[通俗易懂](一)跳跃表 跳跃表是一种有序的数据结构,它通过每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较

Redis学习笔记(四) 跳跃表与整数集合

(一)跳跃表

跳跃表是一种有序的数据结构,它通过每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。

Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表作为有序集合键的底层实现。

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

Redis的跳跃表由zskiplistNode 与 zskiplist 两个结构定义。其中zskiplistNode 结构用于标识跳跃表节点,zskiplist结构用于保存跳跃表节点的相关信息(表头、表尾节点、节点数量等)。

 

zskiplistNode

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

代码100分

中包含多个元素,每个元素是指向其他节点的指针,通过这些层可以加快访问其他节点的速度,层越多,访问其他节点的速度越快。没增加一个跳跃节点,程序根据幂次定律(越大的数出现概率越小)生成1-32之间的值作为层高。

1、每层都有一个指向表尾方向的前进指针,作为表头向表尾方向访问节点。

2、层中的跨度用于记录两个节点之间的距离。

3、后退指针则只能一次跨1个节点进行访问。

4、跳跃表的排序是按照所有节点的分值来排序的。

5、节点中的对象则是保存了一个SDS的字符串。

6、同一个跳跃表的对象必须唯一,但分值可以重复。(相同分数,成员小的靠前排)。

跳跃表zskiplist

代码100分typedef struct zskiplist{
    struct skiplistNode *header,*tail;//表头节点与表尾节点
    unsigned long length;//表中节点的数量
    int level;//表中层数最大的节点的层数(表头不计算在内)
} zskiplist;

 

(二)整数集合

整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现,并且保证集合中不会出现重复元素。

intset

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

contents数组是这个数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项,各个项的数组中按值的大小从小到大有序地排列,并且数组中不包含任何重复项。

 

升级

当我们要将一个新元素添加到整数集合里面时,并且新元素类型比整数集合现有的所有元素类型都长时,整数集合需要先进性升级,然后才能将新的元素添加到整数集合中。

1、根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间。

2、将底层数组现有的所有元素都转换为与新元素相同的类型,并将类型转换后的元素放置到正确位置上,而且在放置元素过程中,需要继续维持底层数组的有序性质不变。

3、将新元素添加到底层数组里面。

4、修改整数集合encoding属性。

因为每次向整数集合添加新元素都有可能引起升级,而每次升级都需要将底层数组中已有的所有元素进行类型转换,所以向整数集合中添加新元素的时间复杂度为O(N);

 

—- end —-

每天学一点,总会有收获。

说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

 

 Redis学习笔记(四) 跳跃表与整数集合[通俗易懂]

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8479.html

(0)
上一篇 2023-02-27
下一篇 2023-02-27

相关推荐

  • Python数据类型:定义和应用

    Python数据类型:定义和应用Python是一种解释型、面向对象、动态数据类型的高级程序语言。Python数据类型分为数字、字符串、列表、元组、字典等。其中数字分为整数和浮点数两种,字符串是以单引号或双引号包含的字符序列,列表和元组是可以修改和不可修改的序列类型,字典是无序的键值对集合。

    2024-01-14
    50
  • 建表建索引等

    建表建索引等创建数据库 create database xxxx; 创建表 create TABLE xxx ( id int auto_increment NOT NULL primary key, firs…

    2023-03-10
    100
  • Python字符串分割:更快、更高效的数据处理方法

    Python字符串分割:更快、更高效的数据处理方法对于Python开发者而言,字符串分割是一项必备技能。在数据处理过程中,字符串分割可以帮助我们将数据从一个长字符串中提取出来,并且可以根据特定的规则进行分隔。在本文中,我们将通过多个方面详细阐述如何使用Python进行字符串分割,并且制定出更快、更高效的数据处理方法。

    2024-01-30
    59
  • HBase Shell 十大花式玩儿法[通俗易懂]

    HBase Shell 十大花式玩儿法[通俗易懂]前言: 工欲善其事必先利其器,今天给大家介绍一下HBase Shell十大花式利器,在日常运维工作中,可以试着用起来。 1. 交互模式 也就是我们最常用到的Shell命令行的方式。 2. 非交互模式

    2023-02-18
    103
  • mysql设置编码格式-[亲测有效]

    mysql设置编码格式-[亲测有效]创建table的时候就使用utf8编码 在每次创建表的时候都在最后加上 就可以很好的支持中文 修改已经有的table的编码 当使用默认编码创建了一个table的时候,是不能支持中文的,这时候使用如下语

    2023-01-31
    103
  • 一站式Kafka平台解决方案——KafkaCenter

    一站式Kafka平台解决方案——KafkaCenterKafkaCenter是什么 KafkaCenter是一个针对Kafka的一站式,解决方案。用于Kafka集群的维护与管理,生产者和消费者的监控,以及Kafka部分生态组件的使用。 对于Kafka的平

    2023-02-28
    98
  • mysql清空表中数据_怎么删除mysql表中的一列

    mysql清空表中数据_怎么删除mysql表中的一列删除表信息的方式有两种 : truncate table table_name; delete * from table_name; 注 : truncate操作中的table可以省略,delete…

    2023-03-27
    99
  • 本地库还原至阿里云RDS服务器

    本地库还原至阿里云RDS服务器摸索了很久,在此也感谢阿里云售后兄弟的支持。 1、 首先得要有个阿里云账号,已经购买RDS数据库(本文针对SQL Server)且已经开通阿里云OSS服务。 2、 本文档适用于以下版本的实例: RDS

    2022-12-20
    107

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注