【Redis】00底层数据结构-redisObject

介绍

Redis底层的数据结构包括:简单动态数组SDS、链表、字典、跳跃链表、整数集合、压缩列表、对象。
Redis为了平衡空间和时间效率,针对value的具体类型在底层会采用不同的数据结构来实现,其中哈希表和压缩列表是复用比较多的数据结构,下面列出对外数据烈性和底层数据结构的关系:

String: SDS简单动态字符串
List: ziplist; linkedlist 
Hash: hashtable; ziplist
Set: intset;hasttable
Zset: skiplist; ziplist

Redis中用了一个通用的数据结构redisObject。举个例子:如果value是一个list,那么它的内部存储结构是一个quicklist(quicklist的具体实现我们放在后面的文章讨论);如果value是一个string,那么它的内部存储结构一般情况下是一个sds。当然实际情况更复杂一点,比如一个string类型的value,如果它的值是一个数字,那么Redis内部还会把它转成long型来存储,从而减小内存使用。而一个robj既能表示一个sds,也能表示一个quicklist,甚至还能表示一个long型。

redisObject结构定义

//redisObject
#define LRU_BITS 24 typedef struct redisObject {
    //对象的数据类型共5种
    unsigned type:4;
    //数据类型的编码类型
    unsigned encoding:4;
    //
    unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */
    //
    int refcount;
    //指向底层实数据实现的指针
    void *ptr;
} robj;

//type的占5种类型:
/* Object types */
#define OBJ_STRING 0    //字符串对象
#define OBJ_LIST 1      //列表对象
#define OBJ_SET 2       //集合对象
#define OBJ_ZSET 3      //有序集合对象
#define OBJ_HASH 4      //哈希对象

// encoding 的10种类型
//原始表示方式,字符串对象是简单动态字符串
#define OBJ_ENCODING_RAW 0     /* Raw representation */     
//long类型的整数
#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 /* Encoded as regular linked list */  
//压缩列表
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */         
//整数集合
#define OBJ_ENCODING_INTSET 6  /* Encoded as intset */         
//跳跃表和字典
#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist */      
//embstr编码的简单动态字符串
#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding */  
//由压缩列表组成的双向列表-->快速列表
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */   

posted @ 2020-04-27 22:46  abs_征召不老  阅读(156)  评论(0)    收藏  举报