采访者:Redis的基本数据类型有哪些?我:Redis的基本数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。面试官:Hash数据类型的内部实现是怎样的?我还沉浸在最后一题的得意中,脸色顿时一僵,手心开始渗出冷汗。“这个……我了解不深。”我吞吞吐吐的说道。采访者:回去等消息吧。这句话干干净净,然后就没有了。失败是成功之母,我没有气馁,决定马上弥补。哈希编码哈希编码有两种,分别是压缩列表(ziplist)和哈希表(hashtable)。当所有键值对的key和value的长度小于hash-max-ziplist-value(默认64字节),且键值对的个数小于hash-max-ziplist-entries(512),哈希将使用压缩列表作为编码,否则将使用哈希表作为编码。举个例子:127.0.0.1:6379>hsetone-hashname"WanmaoXueshe"(integer)1127.0.0.1:6379>hsetone-more-hashgender"Male"(integer)1127.0.0.1:6379>objectencodingone-more-hash"ziplist"此时所有键值对的key和value的长度和键值对的个数都比较少,hash使用压缩列表作为编码。再添加一个值比较大的键值对:127.0.0.1:6379>hsetone-more-hash介绍《Java领域优质创造者,CSDN博客专家认证》(整数)1127.0.0.1:6379>对象编码one-more-hash"hashtable"此时,哈希的编码从压缩列表转换为编码。当然,了解上面的细节并没有完全“征服”面试官,还需要更深入:)hash的底层实现当使用压缩列表作为hash的编码时,增加了新的键值对hash数据类型,先将key的压缩列表节点添加到压缩列表的末尾,再将value的压缩列表节点添加到压缩列表的末尾。因此,在hash数据类型的压缩列表中,先加入的键值对在压缩列表的头部,后加入的键值对在压缩列表的尾部;同一键值对的两个节点间隔很近。相邻,key节点在前,value节点在后。压缩列表使用更紧凑的内存结构实现多个键值对的连续存储,在节省内存方面优于哈希表。当使用哈希表作为哈希的编码时,每个键值对使用字典键值对保存,字典的每个键是一个字符串对象,键值对的键存储在物体;字典中的每一个值也是一个字符串对象,对象中存储的是键值对的值。哈希表虽然没有压缩列表并不节省内存,但其读写时间复杂度为O(1),在时间效率上优于压缩列表。总结哈希数据类型有两种内部实现:压缩列表(ziplist)和哈希表(hashtable)。当哈希数据类型的键和值的长度较小且键值对数量较少时,使用压缩列表作为内部实现,否则使用哈希表作为内部实现。这点我早就看出来了,你我一定是有缘,留下你的喜欢和关注,你日后必成大器。
