Redis 源码阅读笔记(2)-- 对象 robj。熟悉 redis 的同学都应该知道,redis 中主要的数据结构包括简单动态字符串 sds、双端链表 adlist、跳跃表 skiplist、压缩列表 ziplist 和整数集合 intset 等,我们之前只分析了 sds,剩下的几个数据结构我会在后面给大家一一介绍。
我们知道,redis 中有字符串对象 (string)、列表对象(list)、哈希对象(hash)、集合对象(set) 和有序集合对象(zset),而这五种对象都至少用了上面至少一种数据结构实现。通过使用对象 "接口"(暂且理解),针对不同的使用场景,对象可以使用不同的数据结构实现,这样可以优化在不同场景下的效率。下面就让我们一起来看看 redis 中的对象是怎么实现的:
robj 数据结构
- typedef struct redisObject {
- unsigned type: 4; // 类型 unsigned encoding:4; // 编码 unsigned lru:REDIS_LRU_BITS; // 对象最后一次被访问的时间 int refcount; // 引用计数 void *ptr; //ptr指向实现对象的数据结构} robj;
对象的类型 type
数据结构中 type 属性记录了对象的类型,分别是 string、hash、list、set 和 zset,type 占用 4 bit,其取值和类型如下:
- /* Object types */
- #define REDIS_STRING 0#define REDIS_LIST 1#define REDIS_SET 2#define REDIS_ZSET 3#define REDIS_HASH 4
对象的编码 encoding
ptr 指针指向对象实现的底层数据结构,而这些数据结构由 encoding 属性标识,encoding 也占用 4 bit,其取值和对应类型如下:
- #define REDIS_ENCODING_RAW 0 // Raw representation #define REDIS_ENCODING_INT 1 // Encoded as integer #define REDIS_ENCODING_HT 2 // Encoded as hash table #define REDIS_ENCODING_ZIPMAP 3 // Encoded as zipmap #define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */#define REDIS_ENCODING_INTSET 6 /* Encoded as intset */#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */#define REDIS_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
我阅读的源码是 redis3.0 的,zipmap 已经不再使用了,我们就不会再讨论它,有兴趣的同学可以自己看看。
REDIS_ENCODING_RAW:简单动态字符串 sds REDIS_ENCODING_INT:long 型值 REDIS_ENCODING_EMBSTR:采用 embstr 编码的 sds REDIS_ENCODING_HT:字典 dict REDIS_ENCODING_LINKEDLIST:双端链表 adlist REDIS_ENCODING_ZIPLIST:压缩列表 ziplist REDIS_ENCODING_INTSET:整数集合 inset REDIS_ENCODING_SKIPLIST:跳跃表 skiplist 相同 type 属性的对象,可能对应不用的编码 (encoding) 实现,例如:同是 string 对象,编码实现就有三种 1、OBJ_ENCODING_RAW;2、OBJ_ENCODING_INT;3、OBJ_ENCODING_EMBSTR。1、string 对象 (REDIS_STRING) 的编码实现:如上;2、list 对象 (REDIS_LIST) 的编码实现:REDIS_ENCODING_ZIPLIST、REDIS_ENCODING_LINKEDLIST;3、hash 对象 (REDIS_HASH) 的编码实现:REDIS_ENCODING_ZIPLIST、REDIS_ENCODING_HT;4、 set 对象 (REDIS_SET) 的编码实现:REDIS_ENCODING_INTSET、REDIS_ENCODING_HT;5、zset 对象 (REDIS_ZSET) 的编码实现:REDIS_ENCODING_ZIPLIST、REDIS_ENCODING_SKIPLIST。访问时间 lru 引用计数 refcountredis 对象的作用:就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: