面试题答案
一键面试常见对象类型编码动态调整情况
- 字符串(string):
- 当字符串对象保存的是整数值且这个整数值可以用
long
类型表示时,编码会使用int
。 - 当字符串对象保存的是长度小于等于39字节的字符串时,编码会使用
embstr
。 - 当字符串长度超过39字节时,编码会转换为
raw
。
- 当字符串对象保存的是整数值且这个整数值可以用
- 哈希(hash):
- 当哈希对象保存的所有键值对的键和值的字符串长度都小于64字节,并且键值对数量小于512个时,编码使用
ziplist
。 - 否则,编码会转换为
hashtable
。
- 当哈希对象保存的所有键值对的键和值的字符串长度都小于64字节,并且键值对数量小于512个时,编码使用
- 列表(list):
- 当列表对象保存的所有字符串元素的长度都小于64字节,并且列表元素数量小于512个时,编码使用
ziplist
。 - 否则,编码会转换为
linkedlist
(在Redis 3.2之后如果满足一定条件会使用quicklist
)。
- 当列表对象保存的所有字符串元素的长度都小于64字节,并且列表元素数量小于512个时,编码使用
字符串对象编码调整过程及意义
- 调整过程:
- 例如开始创建一个字符串对象保存内容为
"123"
,由于它是可以用long
类型表示的整数值,此时编码为int
。如果后续给这个字符串对象赋值为"hello"
,长度小于39字节,编码会从int
转换为embstr
。若再赋值一个长度超过39字节的字符串,如"a very very long string that exceeds 39 bytes"
,编码就会从embstr
转换为raw
。
- 例如开始创建一个字符串对象保存内容为
- 意义:
- 内存优化:不同编码方式占用内存不同。例如
int
编码对于保存整数值非常高效,占用空间小。embstr
编码在保存短字符串时,将对象头和字符串内容连续存储,减少内存碎片,而raw
编码适用于长字符串,能更好地管理较大的内存区域。 - 性能提升:不同编码在操作效率上有差异。
int
编码在进行数值计算等操作时非常高效,ziplist
编码的哈希和列表在小数据量时遍历等操作有一定优势,而hashtable
和linkedlist
(或quicklist
)在大数据量时能提供更好的扩展性和性能。
- 内存优化:不同编码方式占用内存不同。例如