小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
5redis set类型数据结构字典
字典又称符号表,用于保存键值对的抽象数据结构
set类型 和hash类型都有用到字典
字典是使用哈希表作为底层实现,一个哈希表可以有多个哈希表节点,每个哈希表节点就保存了字典的一个键值对。
dict.h定义了哈希表结构:
/*
* 哈希表
*/
typedef struct dictht {
// 哈希表节点指针数组(俗称桶,bucket)
dictEntry **table;
// 指针数组的大小
unsigned long size;
// 指针数组的长度掩码,用于计算索引值
unsigned long sizemask;
// 哈希表现有的节点数量
unsigned long used;
} dictht;
其中dictEntry结构中保存着一个键值对:
/*
* 哈希表节点
*/
typedef struct dictEntry {
// 键
void *key;
// 值
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
// 链往后继节点
struct dictEntry *next;
} dictEntry;
key属性保存着键值对中的键,v属性保存着键值对中的值,next属性指向另一个哈希表节点的指针,这个指针将多个哈希值相同的键值对连接在一起,来解决键冲突的问题
字典的结构定义:
/*
* 字典
*
* 每个字典使用两个哈希表,用于实现渐进式 rehash
*/
typedef struct dict {
// 特定于类型的处理函数
dictType *type;
// 类型处理函数的私有数据
void *privdata;
// 哈希表(2个)
dictht ht[2];
// 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
int rehashidx;
// 当前正在运作的安全迭代器数量
int iterators;
} dict;
ht属性是包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下,字典使用ht[0],ht[1]在对ht[0]哈希表进行rehash时使用。