一、概述

Redis提供了多种基本数据类型和高级的数据类型,然后每种都有多种实现,Redis自己内部会进行判断应该使用哪种编码,当我们的数据放入Redis后,会被包装成RedisObject,然后存入,来看看RedisObject的结构吧

二、RedisObject结构

当我们执行了set hello world的时候,会产生如下的结构

redis映射表 redis redisobject_缓存


dictEntry:Redis的数据库是一张Hash表,然后里面会包含键值对,可以简单理解为java的HashMap,然后他中间包含了指向Key和Value的指针,以及下一个键值对的指针,可以看出,Redis是基于链地址发的方法解决哈希冲突

key:因为是Key-Value结构的数据库,这边默认实现都是SDS,SDS是简单动态字符串,是Redis提供的编码之一,之后会进行介绍

redisObject:这个是用来存储Value的包装结构,我们的Value会在这里被包装,包含了type,ptr,LRU,encoding,refcount这几个字段

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;

type:表示对象的类型,占4个bit,就是string,hash,list,set,zset这些类型

encoding:表示对象的编码,占用4个bit,例如我们的string会有int、embstr、raw三种编码,zset会有压缩列表和跳表实现

LRU:最后一次被访问的时间,可以计算对象的空转时间,4.0版本占用24bit,如果Redis打开了maxmemory选项,且内存回收算法选择的是volatile-lru或allkeys—lru,那么当Redis内存占用超过maxmemory指定的值时,Redis会优先选择空转时间最长的对象进行释放。

refcount:用于记录该对象被引用的次数,类型为整形,占用4个字节,用于对象的引用计数和内存回收,当创建新对象时,refcount初始化为1;当有新程序使用该对象时,refcount加1;当对象不再被一个新程序使用时,refcount减1;当refcount变为0时,对象占用的内存会被释放。Redis中被多次使用的对象(refcount>1),称为共享对象。Redis为了节省内存,当有一些对象重复出现时,新的程序不会创建新的对象,而是仍然使用原来的对象。这个被重复使用的对象,就是共享对象。目前共享对象仅支持整数值的字符串对象。

ptr:指向具体的数据,占用8个字节

三、RedisObject的大小

4bit+4bit+24bit+4byte+8Byte=16Byte