《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 条评论
登录 后参与评论

相关文章

来自专栏超然的博客

ECMAScript 6 笔记(一)

       1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国...

843
来自专栏恰同学骚年

你必须知道的指针基础-2.指针的声明和使用及数组和指针的关系

  At first,计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中。But,内存角度没有数据类型,只有二进制;数据以字节(8位二进制)为单...

281
来自专栏菜鸟致敬

Python中is和==的区别

Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。

713
来自专栏mukekeheart的iOS之旅

Java基础整理(1)

1、源代码的文件名必须与公共类(public)的类名一致,而且一个源代码文件中最多只能有一个公共类(public) ---- 2、注释: 3种 行注释  以双斜...

2157
来自专栏柠檬先生

JavaScript 基础(六) 数组方法 闭包

在一个对象中绑定函数,称为这个对象的方法。 在JavaScript 中,对象的定义是这样的;     var guagua = {         na...

18810
来自专栏MasiMaro 的技术博文

C函数原理

C语言作为面向过程的语言,函数是其中最重要的部分,同时函数也是C种的一个难点,这篇文章希望通过汇编的方式说明函数的实现原理。

643
来自专栏Vamei实验室

Python进阶06 循环对象

这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念。 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Pytho...

1827
来自专栏玄魂工作室

《改善C程序代码的125个建议》-防止整数类型产生回绕与溢出

以下内容摘抄自《改善C程序代码的125个建议》: 建议2:防止整数类型产生回绕与溢出 到C99为止,C语言为我们提供了12个相关的数据类型关键字来表达各种数据...

2757
来自专栏程序员阿凯

Java 正则表达式

1093
来自专栏cs

c++那些事儿12.0 STL--Map

知识点综述: ---- map:关联容器。 1.0 由key--value组成,通过key,查找value,关键字key唯一。 2....

2855

扫描关注云+社区