Redis哈希结构内存模型剖析
概述 在前文《Redis字符串类型内部编码剖析》之中已经剖析过 Redis最基本的 String类型的内部是怎么编码和存储的,本文再来阐述 Redis中使用 最为频繁的数据类型:哈希(或称散列),在Redis内部是怎么存的。
注: 本文首发于 My Personal Blog,欢迎光临 小站 本文内容脑图如下: 哈希类型内部编码详情 对于 Redis的常用 5 种数据类型(String、Hash、List、Set、sorted set),每种数据类型都提供了 最少两种 内部的编码格式,而且每个数据类型内部编码方式的选择 对用户是完全透明的,Redis会根据数据量自适应地选择较优化的内部编码格式。 如果想查看某个键的内部编码格式,可以使用 OBJECT ENCODING keyname 指令来进行,比如:
对于使用最为频繁的 Hash类型,其内部编码方式可能有两种:
Redis 会根据数据量的情况来自适应地选择这两种编码方式中 较优 的一种,而这一切对用户完全透明。 在 数据条目较少,数据值较小 的时候 Redis会采用 压缩列表(OBJ_ENCODING_ZIPLIST)编码方式进行存储。这里成员"较少",成员值"较小"的标准可以通过如下配置项进行配置:
Redis 默认给出了默认值,当然用户可根据实际情况自行配置。 当 Hash类型键的字段个数 < hash-max-ziplist-entries 并且 每个字段名和字段值的长度 < hash-max-ziplist-value 时,Redis 会使用 OBJ_ENCODING_ZIPLIST来存储该键,反之则会转换为 OBJ_ENCODING_HT的编码方式。 口说无凭,我们不妨先来做个实验感受一下吧: 很明显该实验验证了当 字段值长度大于64时,编码格式会由 ZIPLIST方式切换为 Hashtable方式。 源码之前,了无秘密,我们再来看一下Redis关于这部分切换的源码实现,那就理解得更加清楚了: 下面详解 OBJ_ENCODING_ZIPLIST 和 OBJ_ENCODING_HT 这两种编码格式的内部存储模型,知道了其各自特点和优缺点,自然也就明白了Redis内部使用它们的意图。 OBJ_ENCODING_ZIPLIST 编码 Ziplist 压缩列表是一种紧凑编码格式,总体思想是时间换空间,即以部分读写性能为代价,来换取极高的内存空间利用率,因此只会用于 字段个数少,且字段值也较小 的场景。 压缩列表内存利用率极高的原因与其连续内存的特性是分不开的,其典型的内存结构可以用下图形象地展示出来: 所以如果用 Ziplist来存储 Redis的散列类型的话,元素的排列方式就变成了如下图所示的形象示意图:即key和value都是逻辑连续内存: OBJ_ENCODING_HT 编码 OBJ_ENCODING_HT 这种编码方式内部才是真正的哈希表结构,或称为字典结构,其可以实现O(1)复杂度的读写操作,因此效率很高。 在 Redis内部,从 OBJ_ENCODING_HT类型到底层真正的散列表数据结构是一层层嵌套下去的,关系如下: 这一关系我们可以从 Redis哈希表定义部分的源码来看出: 下面来详解一下各个部分:
【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。 |
-
副标题#e# 在前面分享的《读完这篇文章,就基本搞定了...[详细]
-
副标题#e# 9月15日技术沙龙 | 与东华软件、AWS、京东...[详细]
-
9月15日技术沙龙 | 与东华软件、AWS、京东金融、饿了...[详细]
-
副标题#e# 【新品产上线啦】51CTO播客,随时随地,碎...[详细]
-
副标题#e# 技术沙龙 | 邀您于8月25日与国美/AWS/转转...[详细]
-
技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共...[详细]
-
多种语言(big5\gbk\gb2312\utf8\Shift_JIS\iso8859-1)的网
1、response.setContentType("text/html; charset=GB2...[详细]
-
如果你是一个生活在2003年的程序员,却不了解字符、字...[详细]
-
我的经历 前几天有人问我这个问题。我说GET是用于获取...[详细]
-
manifest.json 复制代码 代码如下: { "name": "我的右...[详细]