redis 对象与编码
redis使用的数据结构包括:简单动态字符串(sds)、双端链表、字典、压缩列表、整数集合等。但是并没有直接使用,而是在此基础上封装了一套对象系统,5种类型的对象:字符串对象、哈希对象、列表对象、集合对象、有序集合对象。
引用计数
对象系统实现基于引用计数技术的内存回收机制;
基于引用计数的对象共享机制,多个键共享一个对象来节约内存。
对象结构
对象结构由server.h/redisObject
表示:
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
// 指向底层数据结构
void *ptr;
} robj;
type :保存对象的类型,由一个常量表示。
使用type
命令可以查看对象的类型
编码与底层实现
对象的ptr 指针指向底层数据结构,而数据结构由encoding属性决定。
每个编码对应一个数据结构,但是每个对象都至少使用两种编码。如图
使用object encoding
命令查看对象使用的编码