首页 > 代码库 > redis源码分析(4)-- 基本数据结构字典dict

redis源码分析(4)-- 基本数据结构字典dict

一、字典结构

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使用后续介绍。

技术分享

 

redis源码分析(4)-- 基本数据结构字典dict