文章目录
- 7. 数据类型的实现
- 8. 什么是空间预分配以及惰性空间释放,SDS 是怎么实现的
- 9. 为什么说 SDS 是二进制安全的呢
- 10. 说说 redis 里的对象
- 11. 使用 RedisObject 的好处
- 12. RedisObject 的具体结构是什么
7. 数据类型的实现
8. 什么是空间预分配以及惰性空间释放,SDS 是怎么实现的
首先,SDS 主要通过 未使用空间来实现的。
- 空间预分配,在 SDS 中的表现是,如果对 SDS 的长度进行修改,程序会多分配一部分的未使用空间,至于分配多少取决于
len
属性,当len<1MB
时,会分配len
的未使用空间;否则分配1MB
。
如果未使用空间,足以放下修改后的字符,
len
是不会发生变化的。也就是说,空间的预分配把字符的重分配次数从 N 次,降为 最多 N 次。
- 惰性空间释放,在 SDS 中的表现是,当字符串缩短时,并不立即释放空间,而是保留为未使用空间,留待后续使用。(当然也可以手动释放)。
9. 为什么说 SDS 是二进制安全的呢
因为 SDS 主要利用 buffer + len + free
,表示字符串,由底层的字符数组 buf
存储字符,len
表示有效的字符长度,程序不会对 buffer
中数据进行任何的限制、过滤或者假设等操作。
10. 说说 redis 里的对象
对象也就是 redis 在底层数据结构之上包装的一层 RedisObject(对象),常见的 RedisObject 有五种:字符串对象、列表对象、哈希对象、集合对象和有序集合对象。
11. 使用 RedisObject 的好处
使用 RedisObject 的优点主要有两个,分别是:
- 通过不同类型的对象,Redis 可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。
- 我们可以针对不同的使用场景,为对象设置不同的实现,从而优化内存或查询速度。
12. RedisObject 的具体结构是什么
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向实际值的指针
void *ptr;
...
} robj;