Redis数据结构分析
本篇将涉及C语言,请确保您拥有C语言相关基础与计算机底层知识
RedisObject (robj)
robj是Redis对象的起点,所有的数据结构都封装到了robj之中。
其源码如下:
struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS;
int refcount;
void *ptr;
};
结构分析
type
type表示对象的类型,占用4bit存储空间。目前包含:REDIS_STRING(字符串)、REDIS_LIST (列表)、REDIS_HASH(哈希)、REDIS_SET(无序集合)、REDIS_ZSET(有序集合)。
encoding
encoding表示对象的内部编码,占用4bit存储空间。
Redis的每种数据类型都至少有两种编码格式。
例如,对于REDIS_STRING,有INT,EMBSTR,RAW三种编码格式。
通过将encoding封装在robj中,Redis可以根据不同场景快速获取编码格式,并针对该场景决定是否优化编码。
lru
lru全称Least Recently Used(最近最少使用),记录对象最后一次被访问的时间。
其占用的内存空间不定,4.0版本占用24bit,2.6版本占用22bit。
该值主要是用于配合LRU算法对内存进行优化。
当Redis占用内存达到maxmemory配置后,会根据LRU删除最近最少使用的对象。
refcount
refcount全称Reference Count(引用计数),主要用于记录当前对象被引用的次数,以判断该对象何时可以回收。
当refcount为0时,代表对象未被引用,可安全回收。
ptr
ptr全称Pointer(指针),这里是robj封装的数据结构的指针。
如果这里的数据是数字,则直接存储数字,其他对象则正常存储。
综上计算,robj的大小一般为4bit+4bit+24bit+4Byte+8Byte,即:16字节。
标签:encoding,对象,Redis,占用,REDIS,robj,数据结构 From: https://blog.51cto.com/ErickRen/8741601