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

相关文章

来自专栏WD学习记录

html5学习笔记(二)

1. min、max、step属性用于包含数字或日期的input类型规定限定(约束)。

8210
来自专栏黑泽君的专栏

代码块:在Java中用{}括起来的代码

 (1)在Java中用{}括起来的代码。 (2)代码块分类:(根据其位置和声明的不同) A:局部代码块       在方法定义中,用于限定变量的生命...

9110
来自专栏Python私房菜

你所不知道的Python | 字符串格式化的演进之路

字符串格式化对于每个语言来说都是一个非常基础和常用的功能,学习Python的同学大概都知道可以用%语法来格式化字符串。然而为了让我们更方便的使用这个常用功能,语...

13430
来自专栏py+selenium

python爬虫笔记之re.IGNORECASE

       re.IGNORECASE有什么用?re.IGNORECASE是什么意思?(原谅我抓下seo。。)

10720
来自专栏我的博客

echo、print、print_r、var_dump使用和区别

1、echo — Output one or more strings(输出一个或者多个字符串) 2、print — Output a string(输出一个字...

31370
来自专栏Django Scrapy

python3 解码base64遇到的问题与解决

错误代码:binascii.Error: Incorrect padding 解决方法 在解码前使用这个方法 if len(message) % 4: ...

38890
来自专栏GreenLeaves

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

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

20880
来自专栏王硕

原 memmove 和 memcpy的区别

18230
来自专栏liuchengxu

Shell 中的中括号用法总结

需要注意的是 [ 与 ] 与操作数之间一定要有一个空格,否则会报错。比如下面这样就会报错:

10530
来自专栏

特色

摘要: 程序中常常需要复制一个对象, 按思路应该是这样的a = [1, 2, 3]b = a# [1, 2, 3]print b 已经复制好了,但是现在得改变一...

9240

扫码关注云+社区

领取腾讯云代金券