「Redis数据结构」哈希对象(Hash)
创始人
2024-04-21 23:29:17
0

「Redis数据结构」哈希对象(Hash)

文章目录

  • 「Redis数据结构」哈希对象(Hash)
    • 一、概述
    • 二、编码
      • ZipList
      • HashTable
    • 三、编码转换

一、概述

Redis中hash对象是一个string类型的field和value的映射表hash特别适合用于存储对象。作为哈希对象的编码,有二种一是ziplist编码, 二是hashtable编码。在不同情况下编码是可以转换的。在Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

Hash结构与Redis中的Zset非常类似:

  • 都是键值存储
  • 都需求根据键获取值
  • 键必须唯一

区别

  • zset的键是member,值是score;hash的键和值都是任意值
  • zset要根据score排序;hash则无需排序

image-20221212100531252

image-20221212100555467

因此,Hash底层采用的编码与Zset也基本一致,只需要把排序有关的SkipList去掉。


二、编码

哈希对象的编码可以是 ziplist 或者 hashtable

ZipList

ziplist 编码的哈希对象使用压缩列表作为底层实现, 每当有新的键值对要加入到哈希对象时, 程序会先将保存了键的压缩列表节点推入到压缩列表表尾, 然后再将保存了值的压缩列表节点推入到压缩列表表尾, 因此:

  • 保存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后;
  • 先添加到哈希对象中的键值对会被放在压缩列表的表头方向, 而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向。

如果我们执行以下 HSET 命令, 那么服务器将创建一个列表对象作为 profile 键的值:


redis> HSET profile name "Tom"
(integer) 1redis> HSET profile age 25
(integer) 1redis> HSET profile career "Programmer"
(integer) 1

如果 profile 键的值对象使用的是 ziplist 编码, 那么这个值对象将会是如图所示。

image-20221212094303353

image-20221212094312116


HashTable

hashtable 编码的哈希对象使用字典作为底层实现, 哈希对象中的每个键值对都使用一个字典键值对来保存:

  • 字典的每个键都是一个字符串对象, 对象中保存了键值对的键;
  • 字典的每个值都是一个字符串对象, 对象中保存了键值对的值。

举个例子, 如果前面 profile 键创建的不是 ziplist 编码的哈希对象, 而是 hashtable 编码的哈希对象。

image-20221212094947208


三、编码转换

Hash结构默认采用ZipList编码,用以节省内存。 ZipList中相邻的两个entry 分别保存field和value

当数据量较大时,Hash结构会转为HT编码,也就是Dict,触发条件有两个:

(1)哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;

(2) 哈希对象保存的键值对数量小于512个。

image-20221212100440423

当不能满足这两个条件的哈希对象需要使用hashtable编码。

对于上面编码转换的两个条件,上限值是可以修改的,具体看配置文件中关于hash-max-ziplist-value选项和hash-max-ziplist-entries选项说明。

  127.0.0.1:6379> config get hash-max-ziplist-value1) "hash-max-ziplist-value"2) "64"127.0.0.1:6379> config get hash-max-ziplist-entries1) "hash-max-ziplist-entries"2) "512"

参考

《Redis 设计与实现》

黑马程序员

上一篇:SpringCloud2.0

下一篇:DAla-Gly-Gly,77286-90-9

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...