码迷,mamicode.com
首页 > 其他好文 > 详细

redis学习笔记(三): dict

时间:2017-10-28 23:54:53      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:部分   ace   nbsp   方便   基本   creat   dex   cte   value   

dict是redis中比较重要的结构了,不像sds, adlist那样是底层的基础结构。涉及到的所有结构体

/* 按照我的理解,dictEntry就是一个key-value对 */

typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;
} dictEntry;

/* 每一个dict都有一个dictType,主要是特定于dict的操作的集合。比如,不同类型的dict,其比较key的方式可能会是不一样的。 */

typedef struct dictType {
unsigned int (*hashFunction)(const void *key);
void *(*keyDup)(void *privdata, const void *key);
void *(*valDup)(void *privdata, const void *obj);
int (*keyCompare)(void *privdata, const void *key1, const void *key2);
void (*keyDestructor)(void *privdata, void *key);
void (*valDestructor)(void *privdata, void *obj);
} dictType;

/* 按照代码中的注释,dictht就是字典的hash表的结构 */
typedef struct dictht {
dictEntry **table;    /* 指针数组,做为hash table的bucket */
unsigned long size; /* table数组的大小,看起来在实现中一直会是2的倍数 */
unsigned long sizemask; /* 为了方便操作记录mask */
unsigned long used; /* 已经使用的bucket个数 */
} dictht;

/* 关键数据结构dict的定义

 * 对于ht[2]这个成员,从实现上看,可能是出于实时的考虑,rehash过程(可能)需要分好几次才全部完成。

 * 那么在rehash过程中,需要一个额外的表做临时存储。

 * rehash的过程,总是从ht[0]往ht[1]迁移数据。迁移过程中,两个表都有数据。迁移完成之后,ht[1]变成ht[0],ht[0]被清空

 

 */

typedef struct dict {
dictType *type;   /* 特定于dict的操作集合 */
void *privdata; /* 特定于dict的数据 */
dictht ht[2];   /* 两个hash表 */
long rehashidx; /* rehashing not in progress if rehashidx == -1 */
int iterators; /* number of iterators currently running */
} dict;

/* If safe is set to 1 this is a safe iterator, that means, you can call
* dictAdd, dictFind, and other functions against the dictionary even while
* iterating. Otherwise it is a non safe iterator, and only dictNext()
* should be called while iterating. */
typedef struct dictIterator {
dict *d;
long index;
int table, safe;
dictEntry *entry, *nextEntry;
/* unsafe iterator fingerprint for misuse detection. */
long long fingerprint;
} dictIterator;

内部提供的操作也比较丰富,目前看到的主要还是dictCreate, dictAdd, dictReplace, dictDelect这几个基本操作。我感觉rehash可能会是一个比较重要的过程,待后面涉及到这一部分再来补上。

redis学习笔记(三): dict

标签:部分   ace   nbsp   方便   基本   creat   dex   cte   value   

原文地址:http://www.cnblogs.com/flypighhblog/p/7748301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!