一、字典结构
Redis中字典采用hash表结构,如下:
typedef struct dictht { dictEntry **table; // hash表数组 unsigned long size; // hash表大小 unsigned long sizemask; // 掩码 unsigned long used; // 已经使用的大小 } dictht;
table是一个数组,每个元素指向一个dictEntry结构。size表示hash表大小,used表示使用的大小。一个size=4的空hash表如下:
dictEntry是一个key-value pair, 定义为:
1 typedef struct dictEntry { 2 void *key; // key 3 union { 4 void *val; 5 uint64_t u64; 6 int64_t s64; 7 double d; 8 } v; // value 9 struct dictEntry *next; // 指向下一个key-value 10 } dictEntry;
next指针用于解决hash冲突,redis总采用直接链址法解决冲突。举例:
Redis中字典定义:
typedef struct dict { dictType *type; // type和privdata区别操作不同类型key-value void *privdata; dictht ht[2]; long rehashidx; /* rehashing not in progress if rehashidx == -1 */ int iterators; /* number of iterators currently running */ } dict;
ht[2]中一般只有ht[0]使用,ht[1]在rehash时使用,ht[1]和rehashindex使用后续介绍。
时间: 2024-10-07 08:58:52