您好,欢迎访问一九零五行业门户网

深入剖析 redis 数据结构 redisObject

redis 是 key-value 存储系统,其中 key 类型一般为字符串,而 value 类型则为 redis 对象(redis object)。redis 对象可以绑定各种类型的数据,譬如 string、list 和 set。 typedef struct redisobject { // 刚刚好 32 bits // 对象的类型,字符串/列表/集
redis 是 key-value 存储系统,其中 key 类型一般为字符串,而 value 类型则为 redis 对象(redis object)。redis 对象可以绑定各种类型的数据,譬如 string、list 和 set。
typedef struct redisobject { // 刚刚好 32 bits // 对象的类型,字符串/列表/集合/哈希表 unsigned type:4; // 未使用的两个位 unsigned notused:2; /* not used */ // 编码的方式,redis 为了节省空间,提供多种方式来保存一个数据 // 譬如:“123456789” 会被存储为整数 123456789 unsigned encoding:4; // 当内存紧张,淘汰数据的时候用到 unsigned lru:22; /* lru time (relative to server.lruclock) */ // 引用计数 int refcount; // 数据指针 void *ptr;} robj;
redis 中定义了 struct redisobject,它是一个简单优秀的数据结构,因为在 redisobject 中数据属性和数据分开来了,其中,数据属性包括数据类型,存储编码方式,淘汰时钟,引用计数。下面一一展开:
数据类型,标记了 redis 对象绑定的是什么类型的数据,有下面几种可能的值;
/* object types */#define redis_string 0#define redis_list 1#define redis_set 2#define redis_zset 3#define redis_hash 4
存储编码方式,一个数据,可以以多种方式存储。譬如,数据类型为 redis_set 的数据编码方式可能为 redis_encoding_ht,也可能为 redis_encoding_intset。
/* 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 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 */
淘汰时钟,redis 对数据集占用内存的大小有「实时」的计算,当超出限额时,会淘汰超时的数据。
引用计数,一个 redis 对象可能被多个指针引用。当需要增加或者减少引用的时候,必须调用相应的函数,程序员必须遵守这一准则。
// 增加 redis 对象引用void incrrefcount(robj *o) { o->refcount++;}// 减少 redis 对象引用。特别的,引用为零的时候会销毁对象void decrrefcount(robj *o) { if (o->refcount refcount == 1) { // 不同数据类型,销毁操作不同 switch(o->type) { case redis_string: freestringobject(o); break; case redis_list: freelistobject(o); break; case redis_set: freesetobject(o); break; case redis_zset: freezsetobject(o); break; case redis_hash: freehashobject(o); break; default: redispanic(unknown object type); break; } zfree(o); } else { o->refcount--; }}
得益于 redis 是单进程单线程工作的,所以增加/减少引用的操作不必保证原子性,这在 memcache 中是做不到的。
struct redisobject 把最后一个指针留给了真正的数据。
捣乱 2014-6-18
http://daoluan.net
原文地址:深入剖析 redis 数据结构 redisobject, 感谢原作者分享。
其它类似信息

推荐信息