redis 对象

    xiaoxiao2021-11-29  29

        对象

        redis有5种对象:字符串对象、列表对象、集合对象、哈希对象、有序集合对象。    redis中有6中主要数据结构:简单动态字符串(SDS)、链表、字典、跳跃表、整数集合、压缩列表。    redis对象主要包含以下属性: /* * Redis 对象 */ typedef struct redisObject { // 类型 unsigned type:4; // 对齐位 unsigned notused:2; // 编码方式 unsigned encoding:4; // LRU 时间(相对于 server.lruclock) unsigned lru:22; // 引用计数 int refcount; // 指向对象的值 void *ptr; } robj;          对象编码表示对象使用的数据结构: /* * 对象编码 */ #define REDIS_ENCODING_RAW // 编码为字符串 #define REDIS_ENCODING_EMBSTR // 编码为embstr编码的SDS #define REDIS_ENCODING_INT // 编码为整数 #define REDIS_ENCODING_HT // 编码为哈希表 #define REDIS_ENCODING_ZIPMAP // 编码为 zipmap #define REDIS_ENCODING_LINKEDLIST // 编码为双端链表 #define REDIS_ENCODING_ZIPLIST // 编码为压缩列表 #define REDIS_ENCODING_INTSET // 编码为整数集合 #define REDIS_ENCODING_SKIPLIST // 编码为跳跃表

    对象可以以多种方式编码:

    字符串可以被编码为 raw、embstr、int (用字符串表示64位数字是为了节约空间)。    大于32字节的字符用raw,小于等于用embstr,数字用int 列表可以被编码为 ziplist 或 linkedlist 。 ziplist 是为节约大小较小的列表空间而作的特殊表示。

    列表所有元素小于64字节且数量小于512时使用ziplist,否则用linkedlist。该上限值可以通过参数修改

    集合可以被编码为 intset 或者 hashtable 。 intset 是只储存数字的小集合的特殊表示。

    集合所有元素是整数值且数量小于512时使用intset,否则用hashtable。该上限值可以通过参数修改

    哈希表可以编码为 ziplist 或者 hashtable 。 ziplist 是小哈希表的特殊表示。

    哈希表所有元素小于64字节且数量小于512时使用ziplist,否则用hashtable。该上限值可以通过参数修改

    有序集合可以被编码为 ziplist 或者 skiplist 格式。 ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。

    有序集合所有元素小于64字节且数量小于128时使用ziplist,否则用skiplist。该上限值可以通过参数修改

    对象内存回收

        对象采用引用计数计数实现内存回收。 每个 redisObject 结构都带有一个 refcount 属性,指示这个对象被引用了多少次。 当新创建一个对象时,它的 refcount 属性被设置为 1 。 当对一个对象进行共享时,Redis 将这个对象的 refcount 增一。 当使用完一个对象之后,或者取消对共享对象的引用之后,程序将对象的 refcount 减一。 当对象的 refcount 降至 0 时,这个 redisObject 结构,以及它所引用的数据结构的内存,都会被释放

       

    转载请注明原文地址: https://ju.6miu.com/read-678624.html

    最新回复(0)