0
点赞
收藏
分享

微信扫一扫

Redis数据结构分析1:Redis对象

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字节。

举报

相关推荐

0 条评论