面试题答案
一键面试编码转换过程
- ziplist编码:
- Redis哈希对象初始元素个数较少且单个元素大小较小时,会使用ziplist编码。ziplist是一种紧凑的、节省内存的数据结构,它将哈希对象的键值对依次存储在一个连续的内存块中。
- 当哈希对象的元素个数超过
hash-max-ziplist-entries
(默认512),或者单个元素的大小超过hash-max-ziplist-value
(默认64字节)时,会发生编码转换。
- hashtable编码:
- 当上述条件触发时,哈希对象会从ziplist编码转换为hashtable编码。hashtable是一种基于哈希表的数据结构,它使用哈希函数将键映射到一个桶数组中,通过链表解决哈希冲突。
对性能的影响
- ziplist编码性能特点:
- 优点:内存占用小,因为它紧凑存储,减少了内存碎片。在元素个数较少且元素较小时,遍历和查找操作相对较快,因为在连续内存块中访问。
- 缺点:当元素个数增加或元素大小变大时,插入、删除操作的时间复杂度会升高,因为需要频繁的内存重分配和数据移动。例如,在ziplist中间插入一个新元素,可能需要移动后续所有元素。
- hashtable编码性能特点:
- 优点:插入、删除和查找操作平均时间复杂度为O(1),在元素较多时性能优势明显。它对内存的管理相对简单,不需要像ziplist那样频繁进行内存重分配。
- 缺点:内存占用相对较大,因为除了存储键值对本身,还需要额外的哈希表结构(桶数组、链表等)。并且在哈希冲突严重时,查找性能会下降到O(n),不过合理的哈希函数和负载因子控制可以减少这种情况发生。