Redis的对象系统(笔记)

148 阅读1分钟

redis虽然是基于key-value的数据库,但是为了最大化使用内存,并不是把所有的对象都是用sds作为value存储,而是通过redisobject进行value的存储。 其具体的结构如下:

typedef struct redisObject{
    // 类型
    unsigned type:4;
    // 编码
    unsigned encoding:4
    指向底层数据结构的指针
    void *ptr
}

也就是说通过这个redisObject对其包含的五种数据结构进行了封装。而encoding就是表明采用了何种数据结构。那么什么情况采用哪种数据结构就成为了redisObject的关键。

字符串

  1. 编码 sds,
  2. 转码操作

列表对象

  1. 编码
  2. 转码操作

哈希对象

  1. 编码
  2. 转码操作

集合对象

  1. 编码
  2. 转码操作

集合对象

  1. 编码

  2. 转码操作

有序集合对象

  1. 编码 zset
  2. 转码操作

引用计数

  1. redis在自己的对象系统中构建了一个引用计数技术来实现内存回收机制(在适当的时候自动释放对象进行内存回收)。
  2. 引用计数还带有对象共享的作用。举个例子: 假设键A创建了一个包含整数值100的字符串对象作为值对象。如果这个时候键B也要创建一个同样保存了整数值100的字符串对象作为值对象,那么服务器有两种选择: 1. 为键值B创建一个新的对象。 2. 让键值A和键B共享同一个字符串对象,并将被共享的对象的引用计数增一。