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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
NoSQL Redis
Redis的常用数据结构之哈希类型
Redis的常用数据结构之哈希类型
36 0
|
2月前
|
存储 NoSQL Redis
Redis 哈希(Hash)
10月更文挑战第16天
41 1
|
3月前
|
存储 NoSQL 算法
5)深度解密 Redis 的哈希(Hash)
5)深度解密 Redis 的哈希(Hash)
31 0
|
4月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
5月前
|
存储 缓存 NoSQL
Redis问题之一致性Hash是如何解决哈希+取余方法中的稳定性问题的
Redis问题之一致性Hash是如何解决哈希+取余方法中的稳定性问题的
69 10
|
6月前
|
存储 JSON NoSQL
Redis第五弹-HASH结构相关指令和介绍,计数功能Hash-哈希(Redis本来就是键值对结构,哈希,就相当于键值对嵌套了一个键值对)的多种指令Hset key field value-
Redis第五弹-HASH结构相关指令和介绍,计数功能Hash-哈希(Redis本来就是键值对结构,哈希,就相当于键值对嵌套了一个键值对)的多种指令Hset key field value-
|
6月前
|
存储 NoSQL 算法
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
|
6月前
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——列表操作与哈希操作
【Redis】 Java操作客户端命令——列表操作与哈希操作
|
6月前
|
机器学习/深度学习 缓存 NoSQL
【Redis】 关于 Redis 哈希类型
【Redis】 关于 Redis 哈希类型
|
6月前
|
存储 NoSQL 算法
Redis数据组织揭秘:全局哈希表
Redis数据组织揭秘:全局哈希表