redis数据结构之RedisObject详解

Redis中的数据存储涉及到RedisObject结构,包括对象类型、编码方式、LRU信息和引用计数等关键字段。对象类型包括string、hash、list、set、zset和module,编码方式则有多种,如RAW、INT、HT等,用于优化内存使用。通过选择合适的数据类型和编码,可以有效地节省内存,特别是在处理大量数据时。例如,将多个字符串整合为一个list可以显著减少内存消耗。
摘要由CSDN通过智能技术生成

Redis中的任意数据类型的键和值都会被封装为一个RedisObject,也叫做Redis对象,源码如下:

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:对象类型,分别是string、hash、list、set和zset,占4个bit位
  • encoding: 底层编码方式,共有11种,占4个bit位
  • lru:lru表示该对象最后一次被访问的时间,其占用24个bit位。便于判断空闲时间太久的key
  • refcount:对象引用计数器,redis对象被创建完后,每被引用一次,则refcount加一,每释放一次引用则减一,计数器为0则说明对象无人引用,可以被回收
  • ptr:指针,指向存放实际数据的空间

其中redis的对象类型如下:

/* A redis object, that is a type able to hold a string / list / set */

#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1      /* List object. */
#define OBJ_SET 2       /* Set object. */
#define OBJ_ZSET 3      /* Sorted set object. */
#define OBJ_HASH 4      /* Hash object. */

/* The "module" object type is a special one that signals that the object
 * is one directly managed by a Redis module. In this case the value points
 * to a moduleValue struct, which contains the object value (which is only
 * handled by the module itself) and the RedisModuleType struct which lists
 * function pointers in order to serialize, deserialize, AOF-rewrite and
 * free the object.
 *
 * Inside the RDB file, module types are encoded as OBJ_MODULE followed
 * by a 64 bit module type ID, which has a 54 bits module-specific signature
 * in order to dispatch the loading to the right module, plus a 10 bits
 * encoding version. */
#define OBJ_MODULE 5    /* Module object. */
#define OBJ_STREAM 6    /* Stream object. */

/* Extract encver / signature from a module type ID. */
#define REDISMODULE_TYPE_ENCVER_BITS 10
#define REDISMODULE_TYPE_ENCVER_MASK ((1<<REDISMODULE_TYPE_ENCVER_BITS)-1)
#define REDISMODULE_TYPE_ENCVER(id) (id & REDISMODULE_TYPE_ENCVER_MASK)
#define REDISMODULE_TYPE_SIGN(id) ((id & ~((uint64_t)REDISMODULE_TYPE_ENCVER_MASK)) >>REDISMODULE_TYPE_ENCVER_BITS)

其中encoding的编码方式具体为如下:

/* Objects encoding. Some kind of objects like Strings and Hashes can be
 * internally represented in multiple ways. The 'encoding' field of the object
 * is set to one of this fields for this object. */
#define OBJ_ENCODING_RAW 0     /* Raw representation */
#define OBJ_ENCODING_INT 1     /* Encoded as integer */
#define OBJ_ENCODING_HT 2      /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6  /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */

翻译成中文就是这样:
在这里插入图片描述

一个type占4bit,encoding占4bit,lru占24bit,refcount占4B,ptr占8B,因此redis对象的头部需要占16B

因此,加入redis存入十个字符串,那么需要存入十个redis对象头和十个SDS,160B就被浪费掉了,但如果十个字符串弄成list存进去,就可以节省144B空间,因此有大量数据存储的时候,往往推荐使用list等类型保存而不是字符串。

redis会根据存储的数据类型不同,选择不同的编码方式,每种数据类型使用的编码方式如下:
在这里插入图片描述
如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔的个人网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值