面试题答案
一键面试1. 紧凑的数据编码
- 整数编码:对于小的整数,Redis 采用紧凑的编码方式存储。例如,当存储 64 位有符号整数时,如果数值范围在一定较小范围内(如
int16_t
范围),Redis 会使用更紧凑的编码格式,仅占用 2 个字节而非 8 个字节。这样在存储大量小整数时,显著减少了空间占用。 - 字符串编码:对于短字符串,Redis 采用一种优化的编码方式。当字符串长度小于 44 字节时,会使用一种直接在结构体中存储字符串内容的方式,避免了额外的指针等开销。同时,对于重复出现的短字符串,可能会采用共享对象机制,多个键值对可以共享同一个字符串对象,进一步节省空间。
2. 共享对象
- Redis 会对一些常用的小对象(如小整数和短字符串)进行共享。在 RDB 文件生成时,这些共享对象仅会被存储一次。例如,多个键值对的值都为整数
1
,在 RDB 文件中这个1
对应的对象只会被保存一份,其他引用这个值的地方通过引用计数的方式指向该共享对象。这样在存储大量相同小对象时,极大地减少了空间占用。
3. 增量编码
- 列表、哈希等数据结构:对于列表和哈希等数据结构,Redis 在 RDB 文件存储时采用增量编码。以列表为例,当向列表中不断添加元素时,RDB 文件不会每次都完整存储整个列表,而是记录列表从上次保存后的增量变化。这样对于频繁更新的列表,避免了重复存储大量相同数据,减少了文件大小。例如,列表
[1, 2, 3]
,当添加元素4
后,RDB 文件可能只记录4
以及相关的位置信息,而非整个[1, 2, 3, 4]
列表。