面试官:Redis中列表的内部实现方式是什么?
阅读原文时间:2022年03月12日阅读:1

在面试间里等候时,感觉这可真暖和呀,我那冰冷的出租屋还得盖两层被子才能睡着。正要把外套脱下来,我突然听到了门外的脚步声,随即门被打开,一位眉毛弯弯嘴唇红红的小姐姐走了进来,甜甜的香水味立刻钻进了我的鼻孔。

面试官小姐姐微笑地说:”您好,我是今天的面试官,那么我们就开始吧!“

我收起直勾勾的眼睛连忙说:“好的,好的。”

面试官小姐姐说:“Redis中基本的数据类型有哪些?”

我立刻回答:“Redis的基本数据类型有:字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset)。”

面试官小姐姐说:“列表类型的内部实现方式是什么?”

我想了想回答到:

列表的内部编码有两种: 压缩列表(ziplist)和链表(linkedlist)。压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值。链表(linkedlist)是由多个结点通过prev和next指针组成的双向链表。当列表元素个数比较少并且每个元素占用空间比较小的时候,使用压缩列表。当列表元素个数比较多或者某个元素占用空间比较大的时候,使用链表。

面试官小姐姐说:“您说的是旧版本的内部编码,3.2版本之后的实现是什么样子的?”

我还沉浸在上一个问题的沾沾自喜中,顿时表情凝固了,手心开始冒出冷汗。“这个。。没有太深入了解”,我支支吾吾的说到。

面试官小姐姐说:“回去等消息吧。”

这句话说的干净利落,我知道已经没有“然后”了,但是不气馁的我问:“可不可以稍微提示一下?”

面试官小姐姐微笑地说:“当然可以,在3.2版本开始,使用了快速列表(quicklist)做为列表类型的内部编码。快速列表(quicklist)是以压缩列表(ziplist)为节点的链表(linkedlist),将链表按段切分,每一段使用压缩列表进行内存的连续存储,多个压缩列表通过prev和next指针组成的双向链表。它结合了压缩列表和链表的优势,进一步压缩了内存的使用量,进一步提高了效率。”

在回家的路上,我反思了一下:不能死读书,还需要关注技术的不断发展和进化。虽然这次面试没有结果,但也不是没有收获的。


参考文献:

《Redis设计与实现》

《Redis开发与运维》

《Redis 深度历险:核心原理与应用实践》

最后,谢谢你这么帅,还给我点赞关注

微信公众号:万猫学社

微信扫描二维码

关注后回复「电子书」

获取12本Java必读技术书籍