HASH
哈希,在redis底层实现的时候,数据的结构叫做dict
这个Dict就是一个用于维护key和value映射关系的数据结构,与很多语言中的Map类型相似。
本质上也是一个数组+链表的形式存在,不同的点在于,每个dict中是可以存在两个(数组+链表)形式的哈希表。
就是为了在扩容的时候避免一次性对所有的key进行重哈希计算操作,而是将重哈希操作分散到之后每次的增删改查中。 这样一来,每次重哈希的时候也不影响单个请求,与redis“快速相响应时间”的设计原则是相符的。
结构
dict为了实现增量式重哈希,在数据结构里面包含两个哈希表。重哈希期间,也就是扩容时候,将数据从第一个哈希表向第二个哈希表迁移。
包含的结构类型有三种,从大到小的结构类型依次是:
dict -> dictht -> dictEntry
具体的结构定义如下:
dict
哈希本身的包装类,也就是我们操作的Hash
typedef struct dict {
dictType *type; // 类型特性的函数,保存了操作特定类型kv的函数
void *privdata; // 私有数据,传递给类型特定函数的可选的参数
dictht ht[2]; // 哈希表,两个dictht哈希表,默认就用一个,另外一个是在rehash(扩容)的时候用的,ht[0]->在使用的hashtable,ht[1]->备用的hashtable
int trehashidx; // rehash索引,默认是-1,因为没有进行rehash
}
dictht
真正的hash表
typedef struct dictht {
dictEntry **table;