热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

字典是一种存储键值对的抽象数据结构,其又被称为符号表(symboltable)、关联数组(associativearray)或映射(map)。Redis使用字典存储键值对

        字典是一种存储键值对的抽象数据结构,其又被称为符号表(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。


推荐阅读
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复hashMap是hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区 ... [详细]
  • 哈希表(HashTable)的开放定址法和链地址法的实现
    散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速 ... [详细]
  • 一、HashMap1.HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是 ... [详细]
  • 常用API-Hashtable类及其与HashMap、HashSet的区别转载请表明出处:http:blog.csdn.netu012637501(嵌入式_小J的天空)一、Hashtable&l ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 从相邻元素对还原数组的解题思路和代码
    本文介绍了从相邻元素对还原数组的解题思路和代码。思路是使用HashMap存放邻接关系,并找出起始点,然后依次取。代码使用了HashMap来存放起始点所在的adjacentPairs中的位置,并对重复的起始点进行处理。 ... [详细]
  • hashmap线程不安全允许有null的键和值效率高一点、方法不是Synchronize的要提供外同步有containsvalue和containsKey方法HashMap是Java1 ... [详细]
  • 要讨论这些常用的默认初始容量和扩容的原因是:当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复 ... [详细]
  • HashMap和Hashtable的区别主要的区别有三点:线程安全性,同步(synchronization),以及速度。(两者都是无序排放)HashMap几乎可以等价于Hashtable,除了Hash ... [详细]
author-avatar
威哥028_438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有