第七课——简单动态字符串、链表、字典、压缩列表

第七课时作业

静哥

by 2016.4.5~2016.4.10

 

【作业描述】

1.解释redis数据库是怎么扩容的?

2.用几句话描述sds结构和压缩列表

【作业-1:解释redis数据库是怎么扩容的】

Redis数据库是使用字典作为底层实现的,对数据库的增删改查操作也是构建在对字典的操作之上。因此,redis数据库的扩容本质上就是字典的扩容。

Redis数据库是使用字典作为底层实现的;而字典使用哈希表作为底层实现;哈希表则可以由多个哈希表节点构成;哈希表节点里保存字典中的一个键值对。

  1. 对哈希表节点、哈希表、字典结构的学习和理解
  2. 哈希表节点(dictEntry

哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存着一个键值对;

  1. key属性:保存键值对中的键;key的数据类型是void *,也就是空类型指针,即任何类型的指针;
  2. v属性:是一个共用体结构(各变量“互斥“),存放键值对的值,这个值可以是一个指针,也可以是uint64_t整数,也可以是int_64_t整数
  3. next属性:指向另一个哈希表节点的指针,该指针可以将多个哈希值相同的键值对连接在一起,来解决键冲突的问题,如下例子:

  1. 哈希表(dictht

  1. table属性:数据类型是dictEntry **,也就是dictEntry类型的数组,数组中每个元素都是指向dictEntry哈希表节点的指针;
  2. size属性:记录hash表的大小;也就是dictEntry[num]数组的长度
  3. used属性:记录哈希表目前已经有的节点,也就是键值对(dictEntry结构)的个数;
  4. Sizemask属性:值是size-1,这个属性和哈希值一起决定一个键应该被放到table数组(dictEntry[num]数组)的哪个索引上面;

 

 

 

 

 

 

 

 

3、字典(dict

Type属性和privdata属性是针对不同类型的键值对,为创建多态字典而设置的;

  1. type属性:一个指向dictType结构的指针,每个dictType结构保存一簇用于操作特点类型键值对的函数,redis会为用途不同的字典设置不同的类型特点函数;

  1. privdata属性:保存了需要传给哪些类型特定函数的可选参数;
  2. ht属性:包含2项的数组,ht[0]和ht[1],这两个元素都是一个dictht哈希表,一般情况下,字典只使用ht[0],ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用。
  3. rehashidx属性:记录了rehash目前的进度,如果没有在进行rehash,则rehashidx=-1,在进行rehash,则rehashidx=0;
  1. 以下是一个完整的字典,没有进行rehash的字典:

二、对哈希算法的学习和理解

1、redis程序根据键值对的键,计算出哈希值和索引值,然后根据索引值将包含键值对的哈希表节点放到哈希表数组的指定索引上;

以下是,redis计算哈希值和索引值的方法:

  1. 多个哈希表节点都有一个next指针,构成一个单向链表,被分配到同一个索引的多个节点可以用单向链表连接起来,解决链冲突问题;

  1. 当哈希表保存的键值对数量太多或者太少时,程序需要对哈希表的大小进行相应的扩展或者收缩;扩展和收缩哈希表的工作可以通过执行rehash(重新散列)操作来完成;

【作业-2:用几句话描述sds结构和压缩列表】

  1. sds结构
  2. C语言里自带的字符串是以空格符结尾的字符数组;
  3. Redis里没有直接使用C语言的字符串,而是自己构建了名为SDS的抽象类型

  1. 压缩列表
  2. 压缩列表是redis为了节约内存而开发的,由一系列特殊编码的连续内存块构成的顺序型(sequence)数据结构;一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值;

来自为知笔记(Wiz)

时间: 2024-10-06 15:53:33

第七课——简单动态字符串、链表、字典、压缩列表的相关文章

Redis底层探秘(一):简单动态字符串(SDS)

redis是我们使用非常多的一种缓存技术,他的性能极高,读的速度是110000次/s,写的速度是81000次/s.这么高的性能背后,到底是怎么样的实现在支撑,这个系列的文章,我们一起去看看. redis的底层数据结构有以下7种,包括简单动态字符串(SDS),链表.字典.跳跃表.整数集合.压缩列表.对象.今天我们一起看下简单动态字符串(simple dynamic string),后面的文章以SDS简称. SDS简介 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称

Redis数据结构(一)简单动态字符串

Redis的字符串采用的是自定义的struct,名字叫做简单动态字符串(simple dynamic string,SDS). 结构如下: struct sdshdr{ int len; int free; char buf[]; }; 采用如此结构的好处是: [1]获取length的时候复杂度为O(1),不需要O(n): [2]动态分配空间,避免缓冲区溢出,避免每次修改或者append都重新分配: [3]二进制安全: 关于第一点显而易见,第二点,为了减少修改字符串带来的内存重分配次数,redi

自已动手写Redis【简单动态字符串序列一】

第一章 简单动态字符串 2.1 引言 字符串String是程序设计中最为常见的一种数据结构,也是最为重要的一种数据结构,Hello World!这个最为精典的程序,是绝大部份人学习一种程序设计语言的入门程序,在这个最为精典的入门程序中,Hello World!就是字符串类型,字符串可以用于软件中信息的提醒.保存等,Redis中key都是String类型的,因此了解String类型对于我们了解Redis以及动手写Redis都是非常有益的. 2.2 字符串基本概念 以上是我们最为熟悉的Hello W

Redis源码解析01: 简单动态字符串SDS

Redis没有直接使用C字符串(以'\0'结尾的字符数组),而是构建了一种名为简单动态字符串( simple  dynamic  string, SDS)的抽象类型,SDS设计API实现对字符串的各种修改. 1:SDS的定义 在sds.h中,定义了结构体sdshdr表示SDS,其定义如下: struct sdshdr { unsigned int len; unsigned int free; char buf[]; }; len记录SDS保存的字符串的长度(不包括末尾的'\0'):free记录

redis 简单动态字符串 SDS

redis 没有直接使用c语言传统的字符串表示,而是自己构建了简单动态字符串(SDS)的抽象类型,并将SDS用作redis的默认字符串表示 redis的数据库里面,包含字符串值的键值对在底层都是SDS实现的 执行 rpush fruits "apple" "banana" "pits" 那么redis将在数据库中创建一个新的键值对,其中: 1.键值对的键是一个字符串对象,对象的底层实现是一个保存了字符串的fruits的SDS 2.键值对的值是一个

Redis数据结构之简单动态字符串

Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将SDS用作Redis的默认字符串表示.在Redis中,C字符串只会作为字符串字面量,用在一些无需对字符串值进行修改的地方,例如打印日志. 一.SDS的结构定义 示例: 二.SDS与C字符串的区别1. 常数复杂度获取字符串长度C字符串长度计算:遍历整个字符串直至遇到代表字符串结尾的空字符,时间复杂度为O(N).SDS长

Redis数据结构之简单动态字符串SDS

Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话,是远远不足以应对面试提问的.本文简单介绍了Redis底层最重要的数据结构 - 简单动态字符串(SDS) Redis使用C语言开发,但并没有使用C语言传统的字符串表示(以空字符结尾的字节数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串的(simple dynamic string,SDS

小白的Redis学习(一)-SDS简单动态字符串

本文为读<Redis设计与实现>的记录.该书以Redis2.9讲解Redis相关内容.请注意版本差异. Redis使用C语言实现,他对C语言中的char类型数据进行封装,构建了一种简单动态字符串(以下简称SDS),该字符串的结构如下 struct sdshdr{ //记录buf数组中已使用字节的数量 //获取字符串的长度时,就是直接返回的这个字段的值 int len; //记录buf数组中未使用字节的数量 int free; //字节数组,用于保存字符串 char buf[]; } SDS遵循

redis数据结构-SDS简单动态字符串

一.使用场景 redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是构建了简单动态字符串(Simple dynamic String SDS)的抽象类型,并将SDS作为默认的字符串表示形式. redis里面C字符串只用在字符串字面量(String literal) ,用在一些无需对字符串修改的地方. 比如打印日志redisLog(REDIS_WARING,"redis is now ready to exit, bye bye...") 1.re