1. Introduction
Redis是一个内存数据库,它采用键值对的方式存储数据,同时支持多种数据结构,如字符串、哈希表、列表、集合和有序集合等。在Redis中,每个键值对的值都是一个object对象,标识为robj
类型。
2. Definition of Object Structure
Redis中的robj
对象的类型定义如下:
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 接下来的字节
unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;
2.1 Type Field
上述代码中,type
字段是一个4位的无符号整数,表示该robj
对象所存储的数据的类型,不同的类型对应着不同的操作,其取值如下:
类型 | 取值 | 说明 |
---|---|---|
REDIS_STRING | 0 | 字符串类型 |
REDIS_LIST | 1 | 列表类型 |
REDIS_HASH | 2 | 哈希表类型 |
REDIS_SET | 3 | 集合类型 |
REDIS_ZSET | 4 | 有序集合类型 |
REDIS_STREAM | 5 | 流类型 |
2.2 Encoding Field
encoding
字段是一个4位的无符号整数,用于存储该robj
对象所存储的数据的编码方式,不同的编码方式对应着不同的操作,其取值如下:
编码方式 | 取值 | 说明 |
---|---|---|
REDIS_ENCODING_RAW | 0 | 原始字符串编码方式:字符串中不包含空字符,数据以空字符结尾 |
REDIS_ENCODING_INT | 1 | 整数编码方式:存储的数据是一个整数,可以是char、short、int和long类型 |
REDIS_ENCODING_HT | 2 | 哈希表编码方式:存储的数据是一个哈希表 |
REDIS_ENCODING_LINKEDLIST | 3 | 链表编码方式:存储的数据是一个链表 |
REDIS_ENCODING_ZIPLIST | 4 | 压缩列表编码方式:存储的数据是一个压缩列表 |
REDIS_ENCODING_INTSET | 5 | 整数集合编码方式:存储的数据是一个整数集合 |
REDIS_ENCODING_SKIPLIST | 6 | 跳跃表编码方式:存储的数据是一个跳跃表 |
REDIS_ENCODING_EMBSTR | 7 | 内嵌字符串编码方式:存储的数据是一个长度较小的字符串,避免了为每个字符串单独分配空间的开销 |
2.3 LRU Field
lru
使用了一个自定义的编码方式来存储LRU时间以进行对象回收和优化内存。它是一个固定大小的域,本文中定义为LRU_BITS
,它的大小取决于Redis实现中需要存储的LRU时间戳的位数。
2.4 RefCount Field
refcount
字段记录着该robj
对象被引用的次数,它是一个16位的有符号整数,从1开始自增。当一个对象的引用计数变为0时,就会被系统销毁。
2.5 Ptr Field
ptr
字段是一个指向实际数据结构的指针,不同类型的数据结构中存储的数据类型和结构是不同的。
3. Conclusion
Redis的robj
结构体定义了存储在Redis数据库中的对象结构,包含了类型、编码方式、LRU时间、引用计数和实际的数据结构等信息。了解robj
结构体的内部实现,对于理解Redis中数据的存储和读写有着重要的意义。