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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:         字典是一种存储键值对的抽象数据结构,其又被称为符号表(symbol table)、关联数组(associative array)或映射(map)。Redis使用字典存储键值对,而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。

相关文章
|
NoSQL Redis
Redis的常用数据结构之哈希类型
Redis的常用数据结构之哈希类型
102 0
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
350 5
|
10月前
|
存储 缓存 NoSQL
Redis哈希结构在提升数据检索速度中的实践应用
本文详细介绍了 Redis 哈希结构的特点、常见使用场景以及如何在实际应用中利用哈希结构提升数据检索速度。通过合理使用 Redis 哈希结构,可以显著提高系统的性能和响应速度。在实际开发中,结合具体业务需求,灵活运用 Redis 提供的多种数据结构,构建高效的缓存和数据存储解决方案。希望本文能帮助您更好地理解和应用 Redis 哈希结构,提升数据检索速度。
263 18
|
存储 NoSQL Redis
Redis 哈希(Hash)
10月更文挑战第16天
191 1
|
存储 NoSQL 算法
5)深度解密 Redis 的哈希(Hash)
5)深度解密 Redis 的哈希(Hash)
235 1
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
存储 缓存 NoSQL
Redis问题之一致性Hash是如何解决哈希+取余方法中的稳定性问题的
Redis问题之一致性Hash是如何解决哈希+取余方法中的稳定性问题的
201 10
|
存储 JSON NoSQL
Redis第五弹-HASH结构相关指令和介绍,计数功能Hash-哈希(Redis本来就是键值对结构,哈希,就相当于键值对嵌套了一个键值对)的多种指令Hset key field value-
Redis第五弹-HASH结构相关指令和介绍,计数功能Hash-哈希(Redis本来就是键值对结构,哈希,就相当于键值对嵌套了一个键值对)的多种指令Hset key field value-
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——列表操作与哈希操作
【Redis】 Java操作客户端命令——列表操作与哈希操作
|
存储 NoSQL 算法
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点