Redis的数据库就是使用字典来作为底层实现的, 对数据库的增、 删、 查、 改操作也是构建在对字典的操作之上的。
举个例子, 当我们执行命令:
redis> SET msg ” hello world"
在数据库中创建一个键为 ”msg ”,值为 ” helloworld 的键值对时, 这个键值对就是保存在代表数据库的字典里面的。
除了用来表示数据库之外, 字典还是hash键的底层实现之一,当一个哈希键包含的键值对比较多, 又或者键值对中的元素都是比较长的字符串时, Redis就会使用字典作为哈希键的底层实现。
字典的实现
字典实现数据库和hash键,那字典由什么实现的呢?
使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保存了字典中的一个键值对。
接下来的三个小节将分别介绍Redis的啥希表、 哈希表节点以及字典的实现。
hash表
hash表由dictht结构定义
table属性是一个数组, 数组中的每个元素都是一个指向dict.h/dictEntry结构的指针, 每个dictEntry结构保存着一个键值对。 size 属性记录了哈希表的大小, 也即是table数组的大小, 而used属性则记录 了哈希表目前已有节点(键值对)的数量。sizemask属性的值总是等于size-1, 这 一个属性和哈希值 一起决定一个键应该被放到table数组的哪个索引上面。
hash表节点
字典
dictType结构
完整的字典结构: