写点什么

redis 数据结构介绍五 - 第五部分 对象

用户头像
Nick
关注
发布于: 2020 年 05 月 27 日

原文链接

前面说了这么些数据结构,其实大家对于 redis 最初的印象应该就是个 key-value 的缓存,类似于 memcache,redis 其实也是个 key-value,key 还是一样的字符串,或者说就是用 redis 自己的动态字符串实现,但是 value 其实就是前面说的那些数据结构,差不多快说完了,还有个 quicklist 后面还有一篇,这里先介绍下 redis 对于这些不同类型的 value 是怎么实现的,首先看下 redisObject 的源码头文件

/* The actual Redis Object */
#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. */
/*
* 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 */
#define LRU_BITS 24
#define LRU_CLOCK_MAX ((1<<LRU_BITS)-1) /* Max value of obj->lru */
#define LRU_CLOCK_RESOLUTION 1000 /* LRU clock resolution in ms */
#define OBJ_SHARED_REFCOUNT INT_MAX
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;

主体结构就是这个 redisObject,

  • type: 字段表示对象的类型,它对应的就是 redis 的对外暴露的,或者说用户可以使用的五种类型,OBJSTRING, OBJLIST, OBJSET, OBJZSET, OBJ_HASH

  • encoding: 字段表示这个对象在 redis 内部的编码方式,由OBJENCODING开头的 11 种

  • lru: 做LRU替换算法用,占24个bit

  • refcount: 引用计数。它允许robj对象在某些情况下被共享。

  • ptr: 指向底层实现数据结构的指针

当 type 是 OBJSTRING 时,表示类型是个 string,它的编码方式 encoding 可能有 OBJENCODINGRAW,OBJENCODINGINT,OBJENCODING_EMBSTR 三种

当 type 是 OBJLIST 时,表示类型是 list,它的编码方式 encoding 是 OBJENCODINGQUICKLIST,对于早一些的版本,2.2这种可能还会使用 OBJENCODINGZIPLIST,OBJENCODING_LINKEDLIST

当 type 是 OBJSET 时,是个集合,但是得看具体元素的类型,有可能使用整数集合,OBJENCODINGINTSET, 如果元素不全是整型或者数量超过一定限制,那么编码就是 OBJENCODING_HT hash table 了

当 type 是 OBJZSET 时,是个有序集合,它底层有可能使用的是 OBJENCODINGZIPLIST 或者 OBJENCODING_SKIPLIST

当 type 是 OBJHASH 时,一开始也是 OBJENCODINGZIPLIST,然后当数据量大于 hashmax_ziplist_entries 时会转成 OBJENCODINGHT



发布于: 2020 年 05 月 27 日阅读数: 58
用户头像

Nick

关注

还未添加个人签名 2017.12.22 加入

还未添加个人简介

评论

发布
暂无评论
redis数据结构介绍五-第五部分 对象