redisObject对象

无论什么数据类型,redis都是以key-value形式保存,并且所有的key都是字符串
redis每存储一条数据,都会生成一个redisObject对象,通过redisObject对象来表示存储的数据

redisObject对象是联结外部数据类型和redis底层数据结构的桥梁,其实是指向底层数据结构

redisObject对象至少包括:
1) 用来描述具体数据的类型
2) 存储的具体数据

 

 

1 redisObject对象的底层结构

结构如下:

typedef struct redisObject {
  unsigned type:4;
  unsigned encoding:4;
  unsigned lru:LRU_BITS;
  int refcount;
  void *ptr;
} robj;

其中:

type:数据类型,占4bit,目前包括:REDIS_STRING(字符串)、REDIS_LIST(列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)

encoding:储存的具体数据对应的redis底层编码,占4bit

lru:对象最后一次被访问的时间,用于redis内存回收算法淘汰key

refcount:引用计数,允许redisObject对象在某些情况下被共享

ptr:指向数据的指针,实际指向数据类型对应的底层数据结构

 

2 redisObject对象示意图

 

redis 放了个对象 redisobject_redis 放了个对象

 

 

3 使用redisObjec对象的好处 

 1) 执行redis命令时,可以通过redisObject 的type和encoding属性来确定是否可以执行相应的命令,不用等操作具体的数据时才发现命令不可执行
 2) 同一数据类型可以使用不同的底层编码,优化不同场景下的使用效率和节省内存
 3) 支持共享和引用计数。当对象被共享时,只占用一份内存拷贝,节省内存
 4) 根据lru属性并结合redis内存回收算法淘汰长时间未使用的key

 

 

4 type,encoding,数据类型和底层数据结构的关系

相同的type,可能对应不同的encoding:同一个数据类型,redis使用了不同的底层数据结构,导致在内存占用和查找性能上会有所不同

redis中每种数据类型都会有至少对应2种底层数据结构

type

redis数据类型

编码

encoding

底层数据结构

REDIS_STRING

String(字符串)

int

REDIS_ENCODING_INT

long型整数的简单动态字符串

REDIS_STRING

String(字符串)

embstr

REDIS_ENCODING_EMBSTR

embstr编码的简单动态字符串

REDIS_STRING

String(字符串)

raw

REDIS_ENCODING_RAW

简单动态字符串

REDIS_LIST

List(列表)

ziplist

REDIS_ENCODING_ZIPLIST

压缩列表

REDIS_LIST

List(列表)

linkedlist

REDIS_ENCODING_LINKEDLIST

双向链表

REDIS_SET

Set(集合)

intset

REDIS_ENCODING_INTSET

整数集合

REDIS_SET

Set(集合)

hashtable

REDIS_ENCODING_HT

字典

REDIS_ZSET

Sorted Set(有序集合)

ziplist

REDIS_ENCODING_ZIPLIST

压缩列表

REDIS_ZSET

Sorted Set(有序集合)

skiplist

REDIS_ENCODING_SKIPLIST

跳表+字典

REDIS_HASH

Hash(哈希)

ziplist

REDIS_ENCODING_ZIPLIST

压缩列表

REDIS_HASH

Hash(哈希)

hashtable

REDIS_ENCODING_HT

字典