《Redis设计与实现》读书笔记(八) ——Redis列表对象和哈希对象实现原理

《Redis设计与实现》读书笔记(八) ——Redis列表对象和哈希对象实现原理

(原创内容,转载请注明来源,谢谢)

一、列表对象

列表对象的编码可以是ziplist(压缩列表)或者linkedlist(双端链表)。

1、ziplist

ziplist底层是压缩列表的方式实现,每个压缩列表节点(entry)保存一个列表元素。如下图所示:

2、linkedlist

linkedlist底层是用双端链表的方式实现,每个双端链表的节点(node)都保存了一个字符串对象,而对象里面保存的是列表的元素。这个方式与ziplist不同。如下图所示:

上图中,StringObject是字符串对象的简化表示,实际上的方式如下(字符串对象three的实际方式):

字符串对象被嵌套在其他对象中,这种情况只有字符串对象会发生,其他四种对象都不允许嵌套在其他对象中。

3、编码使用条件

由于在数据量少的情况下,ziplist效率更高,但是数据量大的时候性能不如linkedlist。因此,当对象同时满足下列两种条件时,会使用ziplist保存列表对象的元素:

1)列表对象中的所有字符串元素长度都小于64字节。64字节这个数目,是在redis配置文件中,list-max-ziplist-value选项确定的,默认值是64字节。

2)列表对象保存的字符串元素个数少于512个。512个元素这个数目,是在redis配置文件中,list-max-ziplist-entries选项确定的,默认值是512个。

上述任一个条件不满足,则会使用linkedlist方式进行编码。

如果一开始是使用ziplist对列表进行编码,而使用过程中节点数目或节点元素长度超过设定使用ziplist的条件,则redis会将其转换成linkedlist的方式进行编码。

4、列表命令执行的条件

二、哈希对象

哈希对象底层编码方式是ziplist或hashtable。

1、ziplist

ziplist实现哈希对象时,是先将键节点压缩进列表,再将值节点压缩进列表。因此ziplist保存哈希对象时,键和值是挨着的。且先添加的哈希对象会在表头,后添加的在表尾。

总体结构如下图所示:

具体的压缩列表如下图所示:

2、hashtable

hashtable实现哈希对象时,每个键值对都用一个字典来保存,且键和值都是字符串对象,分别对应哈希对象中的键和值。

如下图所示:

3、编码使用条件

由于在数据量少的情况下,ziplist效率更高,但是数据量大的时候性能不如hashtable。因此,当对象同时满足下列两种条件时,会使用ziplist保存列表对象的元素:

1)哈希对象中的所有键值对的键和值长度都小于64字节。64字节这个数目,是在redis配置文件中,hash-max-ziplist-value选项确定的,默认值是64字节。

2)哈希对象保存的键值对总数少于512个。512个元素这个数目,是在redis配置文件中,hash-max-ziplist-entries选项确定的,默认值是512个。

上述两个要求和列表中使用ziplist的条件相似,除了配置文件中的配置内容是以hash开头(列表是以list开头)。

4、哈希命令执行条件

——written by linhxx 2017.09.01

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏五毛程序员

C++知识点整理——持续更新

1884
来自专栏GreenLeaves

C#核编之系统数据类型和相应的C#关键字

和任何编程语言一样,C#定义了一组用于表示局部变量、成员变量、返回值以及输入参数的基本数据类型。然而,与其他编程语言不同的是,这些关键字不只是编译器能识别的标记...

1838
来自专栏lgp20151222

js遍历 for-of

522
来自专栏Golang语言社区

Golang 值得注意的地方

Golang 值得注意的地方 ? ? golang 的语法和使用方式都非常简单明了,没有花哨的语法糖,也没有多余的关键字。 但是即使是这么简洁的语言,仍然有一些...

3305
来自专栏数据结构与算法

Tarjan中栈的分析与SLT栈的实现

首先看一下手写的栈: 1 do{ 2 printf("%d ",stack[index]); 3 visit[stack[index]]=0; ...

3116
来自专栏老马说编程

(17) 继承实现的基本原理 / 计算机程序的思维逻辑

第15节我们介绍了继承和多态的基本概念,而上节我们进一步介绍了继承的一些细节,本节我们通过一个例子,来介绍继承实现的基本原理。需要说明的是,本节主要从概念上来介...

1926
来自专栏软件开发 -- 分享 互助 成长

C/C++中static关键词的作用

1、在函数体内的static变量作用范围是该函数体,其只被内存分配一次,所以在下次调用的时候会保持上一次的值。 2、模块内的static全局变量可以被模块内的所...

1688
来自专栏数据结构与算法

字符串匹配问题

、字符串匹配问题 【问题描述】        字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必...

3666
来自专栏天天

作用域

563
来自专栏大数据钻研

JAVA基础

一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。 下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,...

2637

扫码关注云+社区