数据结构_字典hashtable


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表节点

在这里插入图片描述
key属性保存着键值对中的键, 而v属性则保存着键值对中的值, 其中键值对的值可以是一个指针, 或者是个uint64 t整数, 又或者是 个int64_t整数。

字典

type属性是一
在这里插入图片描述
dictType结构
在这里插入图片描述
ht属性是一个包含两个项的数组, 数组中的每个项都是一个dictht晗希表, 一般情况下, 字典只使用 ht(OJ哈希表, ht[l]哈希表只会在对 ht[ 0]哈希表进行rehash时使用。除了ht[1 ]之外, 另 一个和rehash有关的属 性就是rehashidx, 它记录了 rehash目前的进度, 如果目前没有在进行rehash ,那么它的值为-lo

完整的字典结构:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值