面试官:Redis中哈希数据类型的内部实现方式是什么?
面试官:Redis中基本的数据类型有哪些?
我:Redis的基本数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
面试官:哈希数据类型的内部实现方式是什么?
我还沉浸在上一个问题的沾沾自喜中,顿时表情凝固了,手心开始冒出冷汗。“这个。。没有太深入了解”,我支支吾吾的说到。
面试官:回去等消息吧。
这句话说的干净利落,然后就没有然后了。失败是成功的妈妈,我不气馁,决定马上恶补一下。
哈希的编码
哈希的编码有两种,分别是压缩列表(ziplist)和哈希表(hashtable)。当所有键值对的键和值的长度都小于hash-max-ziplist-value
(默认为64字节),并且键值对的数量小于hash-max-ziplist-entries
(默认为512个)的时候,哈希就会使用压缩列表作为编码,否则使用哈希表作为编码。
我们来举个例子:
127.0.0.1:6379> hset one-more-hash name "万猫学社"
(integer) 1
127.0.0.1:6379> hset one-more-hash gender "男"
(integer) 1
127.0.0.1:6379> object encoding one-more-hash
"ziplist"
此时,所有键值对的键和值的长度和键值对的数量都比较小,哈希使用压缩列表作为编码。我们再加入一个值比较大的键值对:
127.0.0.1:6379> hset one-more-hash introduce "Java领域优质创作者、CSDN博客专家认证"
(integer) 1
127.0.0.1:6379> object encoding one-more-hash
"hashtable"
此时,哈希的编码由压缩列表转化为编码。
当然,了解以上细节还没能完全“征服”面试官,我们需要更深入一些:)
哈希的底层实现
当压缩列表作为哈希的编码时,有新的键值对加入到哈希数据类型中,先把键的压缩列表节点添加到压缩列表的末尾,然后再把值的压缩列表节点添加到压缩列表的末尾。
所以,在哈希数据类型的压缩列表中,先加入的键值对在压缩列表的头部方向,后加入的键值对在压缩列表的末尾方向;同一个键值对的两个节点是紧挨在一起的,键的节点在前,值的节点在后。
压缩列表使用更加紧凑的内存结构实现多个键值对的连续存储,在节省内存方面比哈希表表现的更加优秀。
当哈希表作为哈希的编码时,每个键值对都使用一个字典键值对保存,字典的每个键都是一个字符串对象,对象中保存键值对的键;字典的每个值也都是一个字符串对象,对象中保存键值对的值。
哈希表虽然没有压缩列表节省内存,但是它的读写时间复杂度为O(1),在时间效率方面比压缩列表表现的更加优秀。
总结
哈希数据类型的内部实现有压缩列表(ziplist)和哈希表(hashtable)两种。当哈希数据类型的键和值的长度较小并且键值对数量较少时,使用压缩列表作为内部实现,否则使用哈希表作为内部实现。
最后,谢谢你这么帅,还给我点赞和关注。
微信公众号:万猫学社
微信扫描二维码
关注后回复「电子书」
获取12本Java必读技术书籍
面试官:Redis中哈希数据类型的内部实现方式是什么?的更多相关文章
- 面试官:Redis中集合数据类型的内部实现方式是什么?
虽然已经是阳春三月,但骑着共享单车骑了这么远,还有有点冷的.我搓了搓的被冻的麻木的手,对着前台的小姐姐说:"您好,我是来面试的."小姐姐问:"您好,您叫什么名字?&quo ...
- Redis中的Stream数据类型作为消息队列的尝试
Redis的List数据类型作为消息队列,已经比较合适了,但存在一些不足,比如只能独立消费,订阅发布又无法支持数据的持久化,相对前两者,Redis Stream作为消息队列的使用更为有优势. 相信 ...
- [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?
关注「松宝写代码」,精选好文,每日一题 时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
- Redis中哈希分布不均匀该怎么办
前言 Redis 是一个键值对数据库,其键是通过哈希进行存储的.整个 Redis 可以认为是一个外层哈希,之所以称为外层哈希,是因为 Redis 内部也提供了一种哈希类型,这个可以称之为内部哈希.当我 ...
- 搞定面试官 - MySQL 中你知道如何计算一个索引的长度嘛?
大家好,我是程序员啊粥. 今天给大家分享一个我遇到过的比较少见的面试题,那就是 MySQL 中如何计算一个索引的长度. 说实话,我第一次遇到这个问题的时候想当然的以为索引长度就是我们建表时定义的字段长 ...
- Redis 中的高级数据类型
5个基础数据类型 高级功能 ① HyperLogLog (参考) 供不精确的去重计数功能,比较适合用来做大规模数据的去重统计,例如统计 UV > PFADD visitors alice bob ...
- 说一下redis中5种数据类型的底层数据结构
前言: 阅读 redis设计与实现 一书的记录.未完待续... redis我们都知道有5种数据类型,分别是string,list,hash,set,zset,那么你知道它们的底层数据结构实现吗? ...
- Redis中几种数据类型的基本操作指令
Redis基本指令 单线程+多路IO复用技术 1. Key 指令 作用 keys * 查看当前库所有键 exists <key> 判断此键是否存在 type <key> 查看键 ...
- redis中获取每个数据类型top-n的bigkeys信息
需求:之前写的脚本获取redis 最大的top-n的bigkeys,没有区分数据类型,如果要针对每个数据类型的前top-n的bigkeys获取呢? db_ip=5.5.5.101 db_port= p ...
随机推荐
- C编译器中“不是所有的控件路径都返回值”报错
编译器的判断逻辑是是否在所有的分支中都返回了值,即if不成立时也必须返回值.编译器认为如果三个if都不成立则此函数可能没有返回值,故报错.需要将第三个if改为else或者去掉if体直接return.
- 类加载器(JVM)
一.JVM概述 JVM是java是二进制字节码的运行环境 特点: 一次编译,到处运行(跨平台) 自动内存管理 自动垃圾回收功能 常见的JVM Sun Classic VM:世界上第一款商用的java虚 ...
- 精通 Pandas · 翻译完成
协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交流群 724187166 ApacheCN 学习资源 ...
- [论文][半监督语义分割]Semi-Supervised Semantic Segmentation with High- and Low-level Consistency
Semi-Supervised Semantic Segmentation with High- and Low-level Consistency TPAMI 2019 论文原文 code 创新点: ...
- Java8之Stream常用操作方式
哈喽!大家好,我是[学无止境小奇],一位热爱分享各种技术的博主! [学无止境小奇]的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过. [学无止 ...
- Idea Error:java: System Java Compiler was not found in classpath:
前言 这个问题和IDEA的版本有关系,或者有时不小心把项目错误操作了一步,导致出现,这个属于常见错误 解决办法 1:关闭项目,找一个正常运行的项目,将其.idea..mvn文件夹拷贝出来,替换到不能运 ...
- webbrowser 强制 ie11
假设winform程序的名称是TestWebBrowser.exe. 1.在开始菜单内输入"regedit.exe",进入注册表编辑器 2.找到注册表项:HKEY_LOCAL_MA ...
- keystore文件
[-] keystore操作 运行时签名文件路径debug 生成签名文件打包时使用 获取MD5和SH1 修改keystore文件密码 修改keystore文件别名 修改keystore文件别名的密码 ...
- 为 ubuntu 切换更新源
感谢大佬:https://blog.csdn.net/sudaning/article/details/83445677 目录 备份 修改源文件 更新列表 更新软件 备份 sudo cp /etc/a ...
- 利用redis+AOP简单处理MQ冥等问题
思路: 1.利用redis内部的串行执行特性,使用getandset()处理分布式问题; 2.注解提供入参选择,通过数据抽取后计算MD5值,实现业务性值的冥等: 代码区: 1.注解 1 /** 2 * ...