redis虽然是基于key-value的数据库,但是为了最大化使用内存,并不是把所有的对象都是用sds作为value存储,而是通过redisobject进行value的存储。 其具体的结构如下:
typedef struct redisObject{
// 类型
unsigned type:4;
// 编码
unsigned encoding:4
指向底层数据结构的指针
void *ptr
}
也就是说通过这个redisObject对其包含的五种数据结构进行了封装。而encoding就是表明采用了何种数据结构。那么什么情况采用哪种数据结构就成为了redisObject的关键。
字符串
- 编码 sds,
- 转码操作
列表对象
- 编码
- 转码操作
哈希对象
- 编码
- 转码操作
集合对象
- 编码
- 转码操作
集合对象
-
编码
-
转码操作
有序集合对象
- 编码 zset
- 转码操作
引用计数
- redis在自己的对象系统中构建了一个引用计数技术来实现内存回收机制(在适当的时候自动释放对象进行内存回收)。
- 引用计数还带有对象共享的作用。举个例子: 假设键A创建了一个包含整数值100的字符串对象作为值对象。如果这个时候键B也要创建一个同样保存了整数值100的字符串对象作为值对象,那么服务器有两种选择: 1. 为键值B创建一个新的对象。 2. 让键值A和键B共享同一个字符串对象,并将被共享的对象的引用计数增一。