第一部分之字典(第四章)

一,哈希表节点

哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存一个键值对。

typedef struct dictEntry{

  //键

  void *key;

  //值

  union{

    void *val;

    uint64_t u64;

    int64_t s64;

  } v;

  //指向下一个哈希表节点,形成链表

  struct dictEntry *next;

}

二,哈希表

Redis的字典所使用的哈希表由dictht结构定义:

typedef struct dictht{

  //哈西表数组

  dictEntry **tables;

  //哈希表大小

  unsigned long size;

  //哈希表大小掩码,用来计算索引值,总是等于size-1

  unsigned long sizemask;

  //哈希表已经有的节点数量

  unsigned long used;

}

table是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存者一个键值对。

size记录了哈希表的大小,即table数组的大小

used记录了哈希表目前已经有的节点(键值对)的数量

sizemask和哈希值决定一个键应该被放到table数组的哪个索引上(索引值 = hash值 / sizemask)

 三,字典

Redis字典使用的哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点保存一个键值对。

Redis中的字典由dict结构表示:

typedef struct dict{

  //特定类型函数

  dictType *type;

  //私有数据

  void *privdata;

  //哈希表

  dictht ht[2];

  //rehash索引,当rehash不在进行时,值为-1

  int trehashidx;

}

type是一个指向dictType结构的指针,每个dictType结构保存了一些用于操作特定类型键值对的函数,Redis会为不同用途的字典设置不同类型的函数

privdata保存了特定类型函数的参数

type属性和privdata属性时针对不同类型的键值对,为创建多态字典而设置的

typedef struct dictType{

  //计算哈希值的函数

  unsigned int (*hashFunction)(const viod *key)

  //复制键的函数

  //复制值的函数

  //销毁键的函数

  //销毁值的函数

}

猜你喜欢

转载自www.cnblogs.com/inspred/p/10659243.html