当前位置:网站首页>面试官:Redis中哈希数据类型的内部实现方式是什么?
面试官:Redis中哈希数据类型的内部实现方式是什么?
2022-07-04 12:44:00 【51CTO】
面试官:Redis中基本的数据类型有哪些?
我:Redis的基本数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
面试官:哈希数据类型的内部实现方式是什么?
我还沉浸在上一个问题的沾沾自喜中,顿时表情凝固了,手心开始冒出冷汗。“这个。。没有太深入了解”,我支支吾吾的说到。
面试官:回去等消息吧。
这句话说的干净利落,然后就没有然后了。失败是成功的妈妈,我不气馁,决定马上恶补一下。
哈希的编码
哈希的编码有两种,分别是压缩列表(ziplist)和哈希表(hashtable)。当所有键值对的键和值的长度都小于hash-max-ziplist-value
(默认为64字节),并且键值对的数量小于hash-max-ziplist-entries
(默认为512个)的时候,哈希就会使用压缩列表作为编码,否则使用哈希表作为编码。
我们来举个例子:
此时,所有键值对的键和值的长度和键值对的数量都比较小,哈希使用压缩列表作为编码。我们再加入一个值比较大的键值对:
此时,哈希的编码由压缩列表转化为编码。
当然,了解以上细节还没能完全“征服”面试官,我们需要更深入一些:)
哈希的底层实现
当压缩列表作为哈希的编码时,有新的键值对加入到哈希数据类型中,先把键的压缩列表节点添加到压缩列表的末尾,然后再把值的压缩列表节点添加到压缩列表的末尾。
所以,在哈希数据类型的压缩列表中,先加入的键值对在压缩列表的头部方向,后加入的键值对在压缩列表的末尾方向;同一个键值对的两个节点是紧挨在一起的,键的节点在前,值的节点在后。
压缩列表使用更加紧凑的内存结构实现多个键值对的连续存储,在节省内存方面比哈希表表现的更加优秀。
当哈希表作为哈希的编码时,每个键值对都使用一个字典键值对保存,字典的每个键都是一个字符串对象,对象中保存键值对的键;字典的每个值也都是一个字符串对象,对象中保存键值对的值。
哈希表虽然没有压缩列表节省内存,但是它的读写时间复杂度为O(1),在时间效率方面比压缩列表表现的更加优秀。
总结
哈希数据类型的内部实现有压缩列表(ziplist)和哈希表(hashtable)两种。当哈希数据类型的键和值的长度较小并且键值对数量较少时,使用压缩列表作为内部实现,否则使用哈希表作为内部实现。
竟然已经看到这里了,你我定是有缘人,留下你的点赞和关注,他日必成大器。
边栏推荐
- How real-time cloud interaction helps the development of education industry
- 提高MySQL深分页查询效率的三种方案
- Alibaba cloud award winning experience: build a highly available system with polardb-x
- Solution: how to delete the information of Jack in two tables with delete in one statement in Oracle
- Efficient! Build FTP working environment with virtual users
- 微服务入门
- 高质量软件架构的唯一核心指标
- Node mongodb installation
- .NET 使用 redis
- Read the BGP agreement in 6 minutes.
猜你喜欢
比量子化学方法快六个数量级,一种基于绝热状态的绝热人工神经网络方法,可加速对偶氮苯衍生物及此类分子的模拟
Practice: fabric user certificate revocation operation process
爬虫练习题(一)
实时云交互如何助力教育行业发展
Alibaba cloud award winning experience: build a highly available system with polardb-x
CANN算子:利用迭代器高效实现Tensor数据切割分块处理
CommVault cooperates with Oracle to provide metallic data management as a service on Oracle cloud
Oracle 被 Ventana Research 评为数字创新奖总冠军
8个扩展子包!RecBole推出2.0!
诸神黄昏时代的对比学习
随机推荐
Node mongodb installation
使用宝塔部署halo博客
《预训练周刊》第52期:屏蔽视觉预训练、目标导向对话
c#数组补充
Efficient! Build FTP working environment with virtual users
Apache server access log access Log settings
C#/VB. Net to add text / image watermarks to PDF documents
CANN算子:利用迭代器高效实现Tensor数据切割分块处理
使用 NSProxy 实现消息转发
. Net using redis
微服务入门
CANN算子:利用迭代器高效实现Tensor数据切割分块处理
Samsung's mass production of 3nm products has attracted the attention of Taiwan media: whether it can improve the input-output rate in the short term is the key to compete with TSMC
8 expansion sub packages! Recbole launches 2.0!
XILINX/system-controller-c/BoardUI/无法连接开发板,任意操作后卡死的解决办法
When MDK uses precompiler in header file, ifdef is invalid
在 Apache 上配置 WebDAV 服务器
C#基础补充
CVPR 2022 | TransFusion:用Transformer进行3D目标检测的激光雷达-相机融合
PostgreSQL 9.1 soaring Road