面试题答案
一键面试字符串(string)
- 常见编码方式:
- int:如果字符串对象保存的是整数值,且这个整数值可以用long类型表示,那么Redis会使用int编码来保存这个字符串对象。例如,当存储数字 “123456” 时,如果符合条件,会采用int编码。
- embstr:如果字符串对象保存的是长度小于等于39字节的字符串,Redis会使用embstr编码。embstr编码将对象头和字符串内容连续存储在一块内存中,减少内存碎片。例如,存储 “hello world” 这种长度较短的字符串可能使用embstr编码。
- raw:如果字符串对象保存的是长度大于39字节的字符串,Redis会使用raw编码。例如,存储一篇较长的文章内容时,会采用raw编码。
- 编码方式使用场景:
- int:主要为了节省内存,对于能表示为整数的字符串,采用int编码可直接存储数字,减少转换开销。
- embstr:适用于较短字符串,利用连续内存存储方式提升效率,减少内存碎片化。
- raw:对于较长字符串,采用raw编码能更好地管理内存,避免embstr编码在长字符串时可能带来的内存限制问题。
哈希(hash)
- 常见编码方式:
- ziplist:当哈希对象同时满足以下两个条件时,会采用ziplist编码:哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;哈希对象保存的键值对数量小于512个。ziplist是一种紧凑的列表结构,用于存储键值对,可有效节省内存。
- hashtable:当哈希对象无法满足ziplist编码的两个条件之一时,会采用hashtable编码。hashtable是一种哈希表结构,查找、插入和删除操作的平均时间复杂度为O(1)。
- 编码方式使用场景:
- ziplist:适用于小而紧凑的哈希场景,在满足条件时,通过紧凑存储结构节省内存。
- hashtable:当哈希对象规模变大,或者键值对的键或值长度变长时,采用hashtable编码能提供更好的性能,以满足操作效率需求。
列表(list)
- 常见编码方式:
- ziplist:当列表对象同时满足以下两个条件时,会采用ziplist编码:列表对象保存的所有字符串元素的长度都小于64字节;列表对象保存的元素数量小于512个。与哈希对象中的ziplist类似,通过紧凑结构存储元素。
- linkedlist:当列表对象无法满足ziplist编码的两个条件之一时,会采用linkedlist编码。linkedlist是一种双向链表结构,每个节点保存一个元素。
- 编码方式使用场景:
- ziplist:适合存储小规模且元素长度较短的列表,利用其紧凑结构节省内存。
- linkedlist:当列表规模较大或元素长度较长时,linkedlist编码能更好地适应动态插入和删除操作,提供更灵活的内存管理和操作性能。