【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 */

浙公网安备 33010602011771号