面试题答案
一键面试字符串
- 内存占用:简单动态字符串(SDS)结构,内存分配有预分配策略,会额外占用一定内存。若存储大字符串,内存占用会明显增加。
- 读写性能:读写操作直接定位数据,性能高,时间复杂度为O(1)。
- 优化措施:尽量避免存储超大字符串;对于频繁更新的字符串,提前预估长度,减少内存重分配次数。
哈希
- 内存占用:压缩列表(ziplist)编码在元素少且小的情况下内存占用少,哈希表(hashtable)编码在元素多时有较好扩展性,但内存占用相对高。
- 读写性能:哈希表编码读写性能高,时间复杂度接近O(1);压缩列表编码在元素较多时,查找、插入和删除操作性能会下降。
- 优化措施:控制哈希内元素数量,避免从压缩列表编码转为哈希表编码导致内存和性能问题;合理设计哈希结构,减少哈希冲突。
列表
- 内存占用:可由压缩列表或双端链表(quicklist)实现。压缩列表适合小且少的元素,双端链表内存占用大但支持高效两端操作。
- 读写性能:两端插入和删除操作性能高(O(1)),中间插入和删除性能低(O(n)),随机访问性能也低(O(n))。
- 优化措施:尽量在两端进行操作;根据数据量和操作特点选择合适编码,如数据量小用压缩列表。
集合
- 内存占用:整数集合(intset)编码用于元素全为整数且数量少的情况,占用内存少;哈希表编码用于元素类型多样或数量多的情况,内存占用相对高。
- 读写性能:哈希表编码下查找、插入和删除操作性能高(O(1)平均情况),整数集合编码在元素增加可能导致升级操作影响性能。
- 优化措施:提前规划集合元素类型和数量,避免编码转换;利用集合的交集、并集、差集等操作优化业务逻辑,减少多次操作。
有序集合
- 内存占用:跳跃表(skiplist)和哈希表结合实现。内存占用较高,因为既要存储元素分值用于排序,又要维护跳跃表结构。
- 读写性能:插入、删除、查找操作平均时间复杂度为O(log n),按分值范围查询性能也较好。
- 优化措施:合理设置跳跃表的层数,避免过高的内存消耗;减少不必要的分值更新操作,因为每次更新可能影响跳跃表结构。