《Redis设计与实现》阅读:Redis底层研究之哈希表hashtable

        字典是一种存储键值对的抽象数据结构,其又被称为符号表(symbol table)、关联数组(associative array)或映射(map)。Redis使用字典存储键值对,而Redis在底层是通过自定义的哈希表来实现字典这一数据结构的。本文,我们将研究Redis中哈希表的实现。


        结构

        一个哈希表包含多个哈希表节点,每个哈希表节点保存了字典中的一个键值对。在Redis中,哈希表用dictht表示,其结构如下:


        其中,

        1、table是一个数组,里面存储的是用dictEntry表示的哈希表节点,每个节点被用来保存一个键值对;

        2、size表示哈希表的大小,即table数组的大小;

        3、sizemask是哈希表大小掩码,其和键的哈希值一起被使用,用来计算键应该存储在table数组的哪个位置上,其大小固定为size - 1;

        4、used表示目前哈希表已有的哈希表节点数量,也就是键值对的数量。


        再来看下哈希表节点dictEntry的实现,如下:


        其中,

        1、key存储键值对中的键;

        2、v存储键值对中的值,它可以是一个指针,也可以是一个uint64_t整数,还可以是一个int64_t整数;

        3、next是指向另外一个哈希表节点dictEntry的指针,用它来解决键冲突(collision)问题,即两个不同的键哈希值一样,需要存储在table中索引位置index也一样,这样,通过链表形式,将两个key存储在table同一个位置上,解决了键冲突问题。


        最后看下Redis中字典dict的实现,如下:


        其中,

        1、type是指向dictType的指针,而每个dictType保存了一簇用于操作特定类型键值对的函数,为用途不同的词典设置不同的类型特定函数,使得Redis中针对不同类型的键值对,可以创建多态字典。

        2、privdata保存了需要传递给类型特定函数的可选参数;

        3、ht是一个包含两个项的数组,存储两个哈希表dictht,ht[0]用于正常的数据读写,而ht[1]用于在满足一定条件的情况下,哈希表为重新调整负载而进行的rehash操作时的数据暂存,rehash过后,ht[2]会赋值给ht[1],其本身也会被清空;

        4、trehashidx用于避免系统性能瓶颈而采取的渐进式rehash时当前正在进行的索引,记录了rehash的进度,当rehash不在进行时,其值为-1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值