引言

经过前几个文章的学习,大概了解了redis中用到的主要的数据结构:简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表。
但是我们使用的时候并没有直接使用这些数据结构,而是基于这个封装出string、list、hash、set、zset五种对象类型。

1、redis对象的数据结构

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 对象最后一次被访问的时间
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
// 引用计数
int refcount;
// 指向实际值的指针
void *ptr;
} robj;

1.1、encoding

通过编码方式encoding来确定*ptr所指向的数据结构是什么。

1.2、refcount

对象数据结构中的引用计数refcount有两个作用:

  1. 内存回收
    没有引用的时候就回收。
  2. 对象共享
    可以让多个key指向同一个对象,节省内存。

1.3、lru

对象最后一次被访问的时间,当服务器内部不足时,空闲时间长的对象会被回收。

tencent.jpg