面试官: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必读技术书籍

最新文章

  1. jenkins解决jenkins内存溢出问题
  2. 关于java 中文乱码问题 自己的一点解决方案
  3. zoj 3229 Shoot the Bullet(无源汇上下界最大流)
  4. android图片缩小和放大Matrix
  5. js返回顶部封装 简洁
  6. 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
  7. hdu_1576A/B(扩展欧几里得求逆元)
  8. 百词斩APP分析
  9. java面向对象编程--Josephu问题(丢手帕问题)
  10. Hibernate入门(四)---------一级缓存
  11. <Java><Multi-thread><Lock interface>
  12. 内存共享【Delphi版】
  13. Windows使用Idea编译spark源码
  14. Xcode快捷键--灰常实用的快捷键,以后编程快捷多了
  15. 遍历GroupBox上的所有的textbox
  16. [Backbone] Parse JSON on Collection
  17. poi 读取数据处理方式
  18. Windows 以及 Xcode下编译调试 libcurl 源码
  19. Virtual Judge SPOJ - LCS2 Longest Common Substring II
  20. Logstash zabbix 插件

热门文章

  1. CKKS Part2: CKKS的编码和解码
  2. 新一代Python包管理工具来了
  3. Android图表库hellocharts详解
  4. JavaWeb开发获取客户IP地址
  5. 关于unix下cp命令复制权限不够的问题
  6. 关于CSP-S2019的一篇游记
  7. Solution -「ABC 213G」Connectivity 2
  8. Solution -「POI 2011」「洛谷 P3527」MET-Meteors
  9. Solution -「LGR-087」「洛谷 P6860」象棋与马
  10. 【第二十四期】golang 一年经验开发 富途