面试题答案
一键面试字符串
- 数据结构表示:
- 在RDB文件中,字符串对象以简单动态字符串(SDS)的形式存储。SDS结构包含长度信息,以便快速获取字符串长度,而不需要遍历整个字符串。
- 对于小于等于20字节的字符串,会直接以紧凑格式存储在RDB文件中。
- 编码方式:
- INT编码:如果字符串内容是整数值,并且这个整数值可以用64位有符号整数表示,Redis会将其编码为INT,直接存储整数值,这样可以节省空间。
- RAW编码:对于一般的字符串,采用RAW编码,即将SDS内容直接写入RDB文件,包括长度和实际内容。
哈希
- 数据结构表示:
- RDB文件中哈希对象存储为一系列键值对。哈希对象内部使用字典结构来存储这些键值对,字典的每个节点包含键和值的指针。
- 在RDB文件中,先存储哈希对象的元素个数,然后依次存储每个键值对。
- 编码方式:
- HT编码:当哈希对象的键值对数量较多,或者键值对中的键或值长度较长时,采用哈希表(HT)编码。这种编码方式使用字典结构来存储键值对,通过哈希函数来快速定位键值对。
- ZIPLIST编码:当哈希对象的键值对数量较少(默认小于等于512个),并且键值对中的键和值长度较短(小于64字节)时,采用压缩列表(ZIPLIST)编码。ZIPLIST是一种紧凑的、连续内存存储结构,通过特殊的编码格式将多个键值对存储在一起,以节省空间。
列表
- 数据结构表示:
- RDB文件中列表对象存储为一系列元素。列表对象在Redis内部可以由双向链表或压缩列表实现。
- 在RDB文件中,先存储列表的长度,然后依次存储每个元素。
- 编码方式:
- LINKEDLIST编码:当列表元素较多,或者元素长度较长时,采用双向链表(LINKEDLIST)编码。双向链表每个节点包含前驱和后继指针以及元素值,便于在列表两端进行插入和删除操作。
- ZIPLIST编码:当列表元素较少(默认小于等于512个),并且元素长度较短(小于64字节)时,采用压缩列表(ZIPLIST)编码,与哈希对象的ZIPLIST编码类似,通过紧凑的连续内存结构存储元素以节省空间。
集合
- 数据结构表示:
- RDB文件中集合对象存储为一系列成员。集合对象在Redis内部使用哈希表或整数集合实现。
- 在RDB文件中,先存储集合的元素个数,然后依次存储每个成员。
- 编码方式:
- HT编码:当集合成员数量较多,或者成员为非整数值时,采用哈希表(HT)编码。哈希表通过哈希函数快速定位成员,实现快速的添加、删除和查找操作。
- INTSET编码:当集合成员数量较少(默认小于等于512个),并且所有成员都是整数值,且这些整数值都可以用16位有符号整数表示时,采用整数集合(INTSET)编码。INTSET是一种紧凑的、有序的整数集合结构,通过特殊的编码格式存储整数,以节省空间。
有序集合
- 数据结构表示:
- RDB文件中有序集合对象存储为一系列成员及其分数。有序集合对象在Redis内部使用跳跃表和哈希表实现。
- 在RDB文件中,先存储有序集合的元素个数,然后依次存储每个成员及其分数。
- 编码方式:
- SKIPLIST编码:当有序集合成员数量较多,或者成员长度较长时,采用跳跃表(SKIPLIST)和哈希表结合的编码方式。跳跃表用于实现有序集合的排序功能,通过多层链表结构实现快速的范围查询;哈希表用于快速定位成员,通过哈希函数实现快速的查找操作。
- ZIPLIST编码:当有序集合成员数量较少(默认小于等于128个),并且成员长度较短(小于64字节)时,采用压缩列表(ZIPLIST)编码。在压缩列表中,按照分数从小到大存储成员及其分数,以紧凑的方式存储有序集合数据。