概述
上篇博客我简单介绍了 redis 哈希表相关知识,本篇博客我打算在哈希表的基础上,简单整理一下 redis 字典的实现原理
字典
字典又称为符号表、关联数组,映射等,它是一种保存键值对的抽象数据结构。
字典中的键是独一无二的,程序可以在字典中根据键查找与之关联的值,或通过键来更新值,删除值等。它作为一种数据结构内置在许多编程语言中,但 redis 的开发语言C语言并没有实现这种数据结构,因此 redis 构建了自己的字典实现。
redis 字典就是使用上一节我们讲过的哈希表作为底层原理。关于哈希表的知识,可以点击这里参考上一篇博客内容。
redis 中的字典由头文件 dict.h 中的 dict 表示:
typedef struct dict {
// 类型特定函数
dictType *type;
// 私有数据
void *privdata;
// 哈希表
dictht ht[2];
// rehash索引
//当rehash不在进行时,值为-1
in trehashidx; /* rehashing not in progress if rehashidx == -1 */
} dict;
- type 属性是一个指向 dictType 类型结构的指针,每个 dictType 结构保存了一组用户操作特定类型变量的函数,redis 会为用途不同的字典设置不同的函数
- privdata 属性保存了传给 type 函数的可选参数
- ht 属性是一个包含两项的数组,数组中的每一项都是 dictht 类型的哈希表,一般情况下只需要使用 ht[0],ht[1] 是在数组 rehash 时使用的
- trehashidx 属性也是在 rehash 时使用的,使用它来记录 rehash 的进度,如果目前没有进行 rehash,那么它的值是 -1
dictht 类型已经在上一篇博客介绍过,这里我们主要看看 dictType 类型的结构:
typedef struct dictType {
// 计算哈希值的函数
unsigned int (*hashFunction)(const void *key);
// 复制键的函数
void *(*keyDup)(void *privdata, const void *key);
// 复制值的函数
void *(*