iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis之常用数据结构哈希表
  • 740
分享到

Redis之常用数据结构哈希表

Redis常用数据结构-哈希表数据结构之哈希表Redis哈希表 2023-04-11 11:04:41 740人浏览 独家记忆
摘要

目录1.哈希冲突2.链式哈希3.rehash4.渐进式 rehash5.rehash 触发条件哈希表是一种保存键值对(key-value)的数据结构 哈希表优点在于,它能以 O(1) 的复杂度快速查询数据。 怎么做到的呢

哈希表是一种保存键值对(key-value)的数据结构

哈希表优点在于,它能以 O(1) 的复杂度快速查询数据。

怎么做到的呢?

将 key 通过 Hash 函数的计算,就能定位数据在表中的位置,因为哈希表实际上是数组,所以可以通过索引值快速查询到数据。

在哈希表大小固定的情况下,随着数据不断增多,那么哈希冲突的可能性也会越高。

Redis 采用了**「链式哈希」**来解决哈希冲突,在不扩容哈希表的前提下,将具有相同哈希值的数据串起来,形成链接起,以便这些数据在表中仍然可以被查询到

1.哈希冲突

哈希表实际上是一个数组,数组里的每一个元素就是一个哈希桶

当一个键值对的键经过 Hash 函数计算后得到哈希值,再将(哈希值 % 哈希表大小)取模计算,得到的结果值就是该 key-value 对应的数组元素位置,也就是第几个哈希桶

当有两个以上数量的 kay 被分配到了哈希表中同一个哈希桶上时,此时称这些 key 发生了冲突

2.链式哈希

链式哈希是怎么实现的?

实现的方式就是每个哈希表节点都有一个 next 指针,用于指向下一个哈希表节点,因此多个哈希表节点可以用 next指针构成一个单项链表,被分配到同一个哈希桶上的多个节点可以用这个单项链表连接起来,这样就解决了哈希冲突。

随着链表长度的增加,在查询这一位置上的数据的耗时就会增加,因为链表的查询的时间复杂度是 O(n)。

3.rehash

Redis 定义一个 dict 结构体,这个结构体里定义了两个哈希表(ht[2])

之所以定义了 2 个哈希表,是因为进行 rehash 的时候,需要用上 2 个哈希表
在正常服务请求阶段,插入的数据,都会写入到「哈希表 1」,此时的「哈希表 2 」 并没有被分配空间。

随着数据逐步增多,触发了 rehash 操作,这个过程分为三步:

1.给「哈希表 2」 分配空间,一般会比「哈希表 1」 大 2 倍;
2.将「哈希表 1 」的数据迁移到「哈希表 2」 中;
3.迁移完成后,「哈希表 1 」的空间会被释放,并把「哈希表 2」 设置为「哈希表 1」,然后在「哈希表 2」 新创建一个空白的哈希表,为下次 rehash 做准备。

第二步很有问题,如果「哈希表 1 」的数据量非常大,那么在迁移至「哈希表 2 」的时候,因为会涉及大量的数据拷贝,此时可能会对 Redis 造成阻塞,无法服务其他请求

4.渐进式 rehash

为了避免 rehash 在数据迁移过程中,因拷贝数据的耗时,影响 Redis 性能的情况

渐进式 rehash 步骤如下:

1.给「哈希表 2」 分配空间;
2.在 rehash 进行期间,每次哈希表元素进行新增、删除、查找或者更新操作时,Redis 除了会执行对应的操作之外,还会顺序将「哈希表 1 」中索引位置上的所有 key-value 迁移到「哈希表 2」 上;
3.随着处理客户端发起的哈希表操作请求数量越多,最终在某个时间点会把「哈希表 1 」的所有 key-value 迁移到「哈希表 2」,从而完成 rehash 操作。

把一次性大量数据迁移工作的开销,分摊到了多次处理请求的过程中,避免了一次性 rehash 的耗时操作

1.查找一个 key 的值的话,先会在「哈希表 1」 里面进行查找,如果没找到,就会继续到哈希表 2 里面进行找到。

2.新增一个 key-value 时,会被保存到「哈希表 2 」里面,而「哈希表 1」 则不再进行任何添加操作,这样保证了「哈希表 1 」的 key-value 数量只会减少,随着 rehash 操作的完成,最终「哈希表 1 」就会变成空表

5.rehash 触发条件

触发条件跟**负载因子(load factor)**有关系。

Redis之常用数据结构哈希表

主要有两个:

1.当负载因子大于等于 1 ,并且 Redis 没有在执行 bgsave 命令或者 bgrewiteaof 命令,也就是没有执行 RDB 快照或没有进行 AOF 重写的时候,就会进行 rehash 操作。
2.当负载因子大于等于 5 时,此时说明哈希冲突非常严重了,不管有没有有在执行 RDB 快照或 AOF 重写,都会强制进行 rehash 操作

到此这篇关于Redis之常用数据结构哈希表的文章就介绍到这了,更多相关Redis哈希表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: Redis之常用数据结构哈希表

本文链接: https://www.lsjlt.com/news/201418.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis之常用数据结构哈希表
    目录1.哈希冲突2.链式哈希3.rehash4.渐进式 rehash5.rehash 触发条件哈希表是一种保存键值对(key-value)的数据结构 哈希表优点在于,它能以 O(1) 的复杂度快速查询数据。 怎么做到的呢...
    99+
    2023-04-11
    Redis常用数据结构-哈希表 数据结构之哈希表 Redis哈希表
  • 数据结构之—哈希表
    目录 一、哈希表的概念 1.前言 2.概念 二、哈希函数:将任意一个key值映射成整数 1.哈希函数最常用的方法:取模 2.哈希函数设计原则 3.比较对象相等时,hashCode与equals关系 4.MD5:一般给字符串进行hash运算 ...
    99+
    2023-09-07
    散列表 数据结构 java 哈希表
  • Redis常用数据结构哈希表是什么
    这篇文章主要介绍“Redis常用数据结构哈希表是什么”,在日常操作中,相信很多人在Redis常用数据结构哈希表是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis常用数据结构哈希表是什么”的疑惑有所...
    99+
    2023-07-06
  • C++数据结构之哈希表的实现
    目录哈希表概念散列函数直接定址法除留余数法平方取中法哈希冲突线性探测二次探测链地址法哈希表的实现闭散列开散列哈希表概念 二叉搜索树具有对数时间的表现,但这样的表现建立在一个假设上:输...
    99+
    2023-03-11
    C++数据结构 哈希表 C++哈希表 C++数据结构
  • 数据结构Typescript之哈希表实现详解
    目录哈希表的结构特点面向对象方法封装哈希表哈希冲突构造函数基本单元:键值对主体:哈希表增加键值对获取键值删除键值对哈希表的结构特点 相比链表繁杂的遍历处理,哈希表的作用是存储无固定...
    99+
    2023-01-30
    Typescript数据结构哈希表 Typescript数据结构
  • C++数据结构之哈希表如何实现
    本篇内容主要讲解“C++数据结构之哈希表如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++数据结构之哈希表如何实现”吧!哈希表概念二叉搜索树具有对数时间的表现,但这样的表现建立在一个假...
    99+
    2023-07-05
  • C++数据结构哈希表详解
    目录实现散列函数开散列方法闭散列方法(开地址方法)删除*实现 哈希表,即散列表,可以快速地存储和查询记录。理想哈希表的存储和查询时间都是 O(1)。 本《资料》中哈希表分以下几部分:...
    99+
    2024-04-02
  • Java数据结构哈希算法之哈希桶方式解决哈希冲突
    一. 实现形式一(键值对只能为整数) 我们可以先实现一个比较简单的哈希表,使用java中解决哈希冲突的方法,即哈希桶(开散列)方式实现,其中注意: 可以使用内部类方式定义节...
    99+
    2024-04-02
  • Java深入了解数据结构之哈希表篇
    目录1,概念2,冲突-避免3,冲突-避免-哈希函数设计4,冲突-避免-负载因子调节5,冲突-解决-闭散列①线性探测②二次探测6,冲突-解决-开散列/哈希桶7,完整代码1,概念 顺序结...
    99+
    2024-04-02
  • Redis 哈希Hash底层数据结构详解
    目录1. Redis 底层数据结构2. hashtable3. redisDb 与 redisObject4. ziplist5. linkedlist6. quicklist1. ...
    99+
    2022-11-13
    redis中hash的底层 Redis底层数据结构 Redis中Hash数据结构的底层结构
  • C语言数据结构哈希表详解
    #include <stdio.h> #include <stdlib.h> #include <string.h> // 哈...
    99+
    2024-04-02
  • 带你了解Java数据结构和算法之哈希表
    目录1、哈希函数的引入①、把数字相加②、幂的连乘2、冲突3、开放地址法①、线性探测②、装填因子③、二次探测④、再哈希法4、链地址法5、桶6、总结1、哈希函数的引入 大家都用过字典,字...
    99+
    2024-04-02
  • TypeScript基础数据结构哈希表HashTable教程
    目录前言1. 哈希表介绍和特性2. 哈希表的一些概念3. 地址冲突解决方案3.1 方案一:链地址法3.2 方案二:开放地址法4. 哈希函数代码实现5. 哈希表封装5.1 整体框架 v...
    99+
    2023-02-05
    TypeScript 数据结构HashTable TypeScript 哈希表
  • C语言数据结构哈希表是什么
    这篇文章将为大家详细讲解有关C语言数据结构哈希表是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。#include <stdio.h>#include <stdli...
    99+
    2023-06-29
  • Java数据结构之实现哈希表的分离链接法
    哈希表的分离链接法 原理 Hash Table可以看作是一种特殊的数组。他的原理基本上跟数组相同,给他一个数据,经过自己设置的哈希函数变换得到一个位置,并在这个位置当中放置该数据。哦...
    99+
    2024-04-02
  • Redis中哈希结构(Dict)的实现
    目录前言Redis中的Dict结构什么是哈希冲突Redis的渐进式rehashrehash的触发条件扩容扩多大?为什么叫渐进式总结前言 哈希结构是一个在计算机中非常常见的结构。哈希结构可以让我们在O(1)时间复杂度查找元...
    99+
    2023-06-06
    Redis 哈希结构 Redis Dict结构
  • 【数据结构】 | java中 哈希表及其冲突解决
    🎗️ 博客新人,希望大家一起加油进步 🎗️ 乾坤未定,你我皆黑马 目录 1、哈希表概念2、冲突 - 概念3、冲突 - 避免 -哈希函数设计4、冲突 - 避免 -负载因子调节5、冲突 - 解决5....
    99+
    2023-08-24
    数据结构 java 散列表 哈希表 哈希
  • Python篇——数据结构与算法(第六部分:哈希表)
      目录 1、直接寻址表 2、直接寻址表缺点 3、哈希 4、哈希表 5、解决哈希冲突 6、拉链法 7、常见哈希函数 8、哈希表的实现 8.1迭代器iter()和__iter__ 8.2str()和repr() 8.3代码实现哈希表 8.4哈...
    99+
    2023-09-10
    python 数据结构 算法 哈希算法
  • Java数据结构中实现哈希表的分离链接法
    这篇文章主要介绍“Java数据结构中实现哈希表的分离链接法”,在日常操作中,相信很多人在Java数据结构中实现哈希表的分离链接法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构中实现哈希表的分离...
    99+
    2023-06-20
  • Redis哈希结构内存模型是怎样的
    本篇内容主要讲解“Redis哈希结构内存模型是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis哈希结构内存模型是怎样的”吧!哈希类型内部编码详情对于 Redis的常用 5...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作