当前位置: 首页 > 后端技术 > Java

面试官:Redis中列表的内部实现是怎样的?

时间:2023-04-01 14:38:40 Java

在面试室等候的时候,感觉真的很暖和。我冷冷的出租屋要盖上两层被子才能入睡。正准备脱下外套,突然听到门外传来脚步声,紧接着门被打开,一位眉眼红唇的小姑娘走了进来,一股甜甜的香水味顿时钻进了我的鼻孔。面试官小姐笑着说:“大家好,我是今天的面试官,那我们开始吧!”我闭上眼睛连忙说:好吧好吧。面试官小姐姐说:Redis有哪些基本数据类型?我马上回答:“Redis的基本数据类型有:字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset)。”面试官小姐姐说:list类型的内部实现是怎样的?我想了想回答:链表有两种内部编码:压缩链表(ziplist)和链表(linkedlist)。压缩列表(ziplist)是由连续内存组成的顺序数据结构。压缩列表可以包含任意数量的节点,每个节点可以包含一个字节数组或一个整数值。链表(linkedlist)是由多个节点通过prev和next指针组成的双向链表。当列表元素数量比较少,每个元素占用空间比较小的时候,使用压缩列表。当列表元素数量较多或某个元素占用空间较大时,使用链表。面试官小姐姐说:“你说的是老版本的内部编码,3.2版本之后的实现是什么样子的?”还沉浸在之前问题的得意情绪中,我的表情顿时僵住了,手心开始渗出冷汗。“这个……我了解不深。”我吞吞吐吐的说道。面试官女士说:“回去等消息吧。”这句话工整利落,我知道没有“然后”,但我并不气馁,问道:“你能给我一点提示吗?”面试官小姐姐笑着说:“当然,从3.2版本开始,使用了快速列表(quicklist)作为列表类型的内部编码。快速列表(quicklist)是一个链表(linkedlist)和一个压缩列表(ziplist)为节点,链表是分段的,分段,每个分段使用一个压缩链表连续存储内存,多个压缩链表是由prev和next指针组成的双向链表,它结合了压缩链表和链表的优点列表,进一步压缩内存占用,进一步提升效率。”回家的路上,我反省:自己不能只好好学习,还要关注技术的不断发展和演进,这次面试虽然没有结果,但也不是没有结果。参考资料:《Redis设计与实现》《Redis开发与运维》《Redis 深度历险:核心原理与应用实践》已经看到了,你我一定是有缘人,留下你的点赞和关注,你日后必成大器。