Redis字典
字典中每个键对应一个值,并且字典中的键是独一无二的。C语言没有内置字典这个数据结构,Redis实现了该数据结构。字典在Redis中的使用是相当普遍的,例如对于Redis键值对数据库,底层就是使用字典实现的。
例如
redis> set k1 "redis"
其中键”k1”、值”redis”,就是保存在代表Redis数据库的字典里面的。
Redis字典底层是使用哈希表实现的,熟悉Java哈希表的同学对该数据结构应该比较清楚,Redis哈希表和Java哈希表的实现有很多相同之处。
一个哈希表包括若干哈希表结点,每个结点就是一个键值对。
哈希表
Redis的哈希表定义如下
typedef struct dictht {
//哈希表数组
dictEntry **table;
//哈希表大小(table数组的大小)
unsigned long size;
//哈希表大小掩码,用于计算索引值,其值总是等于size-1
unsigned long sizemask;
//哈希表已有结点的数量
unsigned long used;
} dictht;
- 其中table是一个数组,数组中保存的是dictEntry,每个dictEntry是一个键值对
- size记录了哈希表的大小,也就是table数组的大小
- sizemask是掩码,用于计算索引值,其值总是等于size-1。原理如下
key%size == key & (size-1)
- used记录了哈希表已有结点的数量
图1
上图展示了一个空的哈希表
哈希表结点
Redis定义了哈希表结点,如下所示