[2015.9] redis 代码拉于 github
1. event loop
一张图来描述redis的事件循环:
2. command table
【待写】
3. store struct
/* 5中数据类型 */
#define OBJ_STRING 0
#define OBJ_LIST 1
#define OBJ_SET 2
#define OBJ_ZSET 3
#define OBJ_HASH 4
/* 多种编码方式,即多种存储结构 */
#define OBJ_ENCODING_RAW 0 /* Raw representation */
#define OBJ_ENCODING_INT 1 /* Encoded as integer */
#define OBJ_ENCODING_HT 2 /* Encoded as hash table */
[not use any more]#define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
[not use any more]#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 */
#define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
/* 数据类型和编码方式的使用条件和相互转换 */
OBJ_STRING [如SET命令]
OBJ_ENCODING_RAW 字符串长度小于等于44
OBJ_ENCODING_EMBSTR 字符串长度大于44
OBJ_ENCODING_INT 数字类型,当值能存在一个指针中时,以该类型保存,否则,即大整数,就用OBJ_ENCODING_RAW类型
OBJ_LIST [如LPUSH命令]
OBJ_ENCODING_QUICKLIST 用作队列的存储
OBJ_SET [如SADD命令]
OBJ_ENCODING_HT 当不是整数的时候采用dict存储,当INTSET中新来一个非INT时,以及当INTSET成员个数超过一定值时转成dict存储
OBJ_ENCODING_INTSET 当是整数时采用整数集合,当INTSET中新来一个非INT时,以及当INTSET成员个数超过一定值时转成dict存储
OBJ_ZSET [如ZADD命令]
OBJ_ENCODING_SKIPLIST 有序集合,当ziplist中的数据个数超过限制,或者新来一个长度大于限制的值则转成skiplist存储
OBJ_ENCODING_ZIPLIST 当开始时,成员个数较少,单个成员的体积都较小则用ziplist,否则转成skiplist
OBJ_HASH [如HSET命令]
OBJ_ENCODING_ZIPLIST 当成员大小小于等于指定值,或者成员个数小于等于指定值都采用这个
OBJ_ENCODING_HT 当成员大小大于指定值,,或者成员个数大于指定值都采用这个