大厂面试官问我:为什么Redis的rehash采用渐进式,而Java的hashmap是一次性rehash?【后端八股文十二:Redis hash八股文合集】

 本文为【Redis hash八股文合集】初版,后续还会进行优化更新,欢迎大家关注交流~

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
19d95742d45b4220ad0ae0359ffcba93.png

💥个人主页:绝命Coding-CSDN博客
💥 所属专栏:后端技术分享
这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖

    往期内容(篇幅过多,不一一列出,感兴趣的小伙伴可以查看专栏):

大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】-CSDN博客

hash


相当于Java的HashMap,无序字典,内部实现结构上同Java的HashMap一致,也是  数组+链表
hash冲突就会用链表

redis中hash如果哈希冲突多,有什么办法改进
  1. 调整哈希函数: Redis 默认使用 MurmurHash2 算法作为哈希函数,这个算法在大多数情况下都能提供良好的散列分布。但如果发现特定的数据模式导致严重的哈希冲突,可以尝试使用其他哈希算法,比如 SHA-1 或 CRC32。
  2. 增大 hash table 的大小: Redis 的 hash table 是动态调整大小的,当冲突过多时可以显式地调用 HRESIZE 命令来增大 hash table 的大小,从而减少冲突。
  3. 使用 Redis 集群: Redis 集群模式下,key 会根据哈希值被自动分布到不同的节点上,有效地缓解了单机 hash table 的冲突问题。

Redis中hashmap数据类型的相关方法?
  • HSET/HMSET: 设置 hash field 的值
  • HGET/HMGET: 获取 hash field 的值
  • HDEL: 删除 hash field
  • HLEN: 获取 hash 包含的 field 数量
  • HKEYS/HVALS: 获取所有 field 名称或值
  • HGETALL: 获取整个 hash 的所有 field 和值

 

Redis中hashmap类型的大键在集群情况下是否在多台机器上,还是单台机器上?
  • 在 Redis 集群模式下,hash 的大 key 会根据 CRC16 hash 算法被分配到不同的分片(slot)上,也就是分散在不同的节点上。
  • 这样可以更好地利用集群的存储和计算能力,提高整体的吞吐量和可扩展性。
  • 对于单机 Redis,hash 的大 key 则都存储在同一台机器上。

Redis的哈希底层?

Redis 的哈希底层使用了一种叫做 "dict" 的哈希表数据结构来实现。

"dict" 由两个哈希表组成,主哈希表和备用哈希表。主哈希表用于存储数据,备用哈希表主要用于 rehash 操作。

每个哈希表由一个 dictht 结构体表示,包含了数组、已使用的槽数量、总槽数量等属性。

哈希算法使用 MurmurHash2,可以根据需要切换到其他算法如 SipHash。

Redis hash怎么存, 哈希冲突 扩容, 查询流程

(1)存储

  • Redis 的 hash 数据类型底层使用 dict 结构来存储 key-value 对。
  • 每个 hash 对应一个 dict,key 为 hash field,value 为对应的值。
  • 当 hash 的 field 过多时,会自动扩容 dict 以减少冲突。

(2)解决哈希冲突

  • Redis 使用拉链法来解决哈希冲突,即一个槽位下挂载一个链表存储所有冲突的键值对。
  • 当冲突过多时,会自动对主哈希表进行 rehash 操作,把数据迁移到更大的哈希表中

(3)哈希表的扩容

  • rehash 分为两个阶段:渐进式 rehash 和自动 rehash。
  • 渐进式 rehash 会在每次查询/更新时,将一部分数据迁移到新的哈希表中。
  • 当渐进式 rehash 完成后,会自动切换到新的哈希表,旧表被删除。

(4)查询流程

  • 查询时,先根据 key 计算出 hash 值,定位到主哈希表的对应槽位。
  • 遍历槽位下的链表,逐个比对 field 名称找到对应的值。
  • 如果正在执行 rehash,还需要同时查询备用哈希表。
Redis为什么要这么用渐进式哈希来扩容
  • 一次性 rehash 会导致短暂的服务中断,因为在 rehash 完成之前,无法处理任何请求。
  • 渐进式 rehash 可以将 rehash 过程拆分成多个步骤,在处理正常请求的同时,逐步迁移数据到新的哈希表。
  • 这样可以大大减少 rehash 过程对服务的影响,提高系统的可用性。

redis的hash渐进式扩容的触发条件
  • Redis 会监控哈希表的负载因子(used_slots / total_slots),当主哈希表的负载因子超过阈值(1.0)时,会开始执行渐进式 rehash。
  • 具体的阈值可以通过 hash-max-ziplist-entrieshash-max-ziplist-value 配置参数来控制。
  • 除了负载因子,Redis 也会根据当前的内存使用情况来决定是否需要触发 rehash。

渐进式 rehash 的过程
  • Redis 会在处理每个请求时,顺带将主哈希表中的一个 entry 迁移到备用哈希表中。
  • 这样可以将 rehash 过程分散到每个请求中,减少对服务的影响。
  • 当备用哈希表的 entry 数量超过主哈希表的 50% 时,Redis 会切换到使用备用哈希表作为新的主哈希表。

Redis渐进式rehash过程中,每处理⼀个请求时,从哈希表1中的第 ⼀个索引位置开始,顺带着将这个索引位置上的所有entries拷贝到哈希表2中,这个请求是读请求还是写请求?

这个请求可以是读请求,也可以是写请求

无论是读请求还是写请求,只要涉及到访问 hash 数据结构,Redis 都会进行这个渐进式迁移的动作。

如果渐进式时,这些的key突然都不访问了 会有什么问题
  • 如果 hash 中的 key 在 rehash 期间完全没有访问,那么 rehash 的进度会非常缓慢。
  • 为了解决这个问题,Redis 会在处理查询/更新请求时,优先将对应 key 所在槽位的数据迁移到新哈希表。
  • 这样可以确保热点数据能够尽快完成迁移,提高 rehash 的效率。

为啥redis的rehash采用渐进式,而hashmap是一次性rehash
  • Java 的 HashMap 采用一次性 rehash 是因为它是单机内存数据结构,不需要考虑服务可用性。
  • 而 Redis 作为分布式缓存,需要在保证服务高可用的同时,完成动态扩容,所以采用了渐进式的 rehash 机制。
Redis中hashmap类型的大键在集群情况下是否在多台机器上,还是单台机器上?
  • 在 Redis 集群模式下,hash 的大 key 会根据 CRC16 hash 算法被分配到不同的分片(slot)上,也就是分散在不同的节点上。
  • 这样可以更好地利用集群的存储和计算能力,提高整体的吞吐量和可扩展性。
  • 对于单机 Redis,hash 的大 key 则都存储在同一台机器上。

Redis的哈希底层?

Redis 的哈希底层使用了一种叫做 "dict" 的哈希表数据结构来实现。

"dict" 由两个哈希表组成,主哈希表和备用哈希表。主哈希表用于存储数据,备用哈希表主要用于 rehash 操作。

每个哈希表由一个 dictht 结构体表示,包含了数组、已使用的槽数量、总槽数量等属性。

哈希算法使用 MurmurHash2,可以根据需要切换到其他算法如 SipHash。

Redis hash怎么存, 哈希冲突 扩容, 查询流程

(1)存储

  • Redis 的 hash 数据类型底层使用 dict 结构来存储 key-value 对。
  • 每个 hash 对应一个 dict,key 为 hash field,value 为对应的值。
  • 当 hash 的 field 过多时,会自动扩容 dict 以减少冲突。

(2)解决哈希冲突

  • Redis 使用拉链法来解决哈希冲突,即一个槽位下挂载一个链表存储所有冲突的键值对。
  • 当冲突过多时,会自动对主哈希表进行 rehash 操作,把数据迁移到更大的哈希表中

(3)哈希表的扩容

  • rehash 分为两个阶段:渐进式 rehash 和自动 rehash。
  • 渐进式 rehash 会在每次查询/更新时,将一部分数据迁移到新的哈希表中。
  • 当渐进式 rehash 完成后,会自动切换到新的哈希表,旧表被删除。

(4)查询流程

  • 查询时,先根据 key 计算出 hash 值,定位到主哈希表的对应槽位。
  • 遍历槽位下的链表,逐个比对 field 名称找到对应的值。
  • 如果正在执行 rehash,还需要同时查询备用哈希表。
Redis为什么要这么用渐进式哈希来扩容
  • 一次性 rehash 会导致短暂的服务中断,因为在 rehash 完成之前,无法处理任何请求。
  • 渐进式 rehash 可以将 rehash 过程拆分成多个步骤,在处理正常请求的同时,逐步迁移数据到新的哈希表。
  • 这样可以大大减少 rehash 过程对服务的影响,提高系统的可用性。

redis的hash渐进式扩容的触发条件
  • Redis 会监控哈希表的负载因子(used_slots / total_slots),当主哈希表的负载因子超过阈值(1.0)时,会开始执行渐进式 rehash。
  • 具体的阈值可以通过 hash-max-ziplist-entrieshash-max-ziplist-value 配置参数来控制。
  • 除了负载因子,Redis 也会根据当前的内存使用情况来决定是否需要触发 rehash。

渐进式 rehash 的过程

(空间换时间的渐进式哈希)

  • Redis 会在处理每个请求时,顺带将主哈希表中的一个 entry 迁移到备用哈希表中。
  • 这样可以将 rehash 过程分散到每个请求中,减少对服务的影响。
  • 当备用哈希表的 entry 数量超过主哈希表的 50% 时,Redis 会切换到使用备用哈希表作为新的主哈希表。

Redis渐进式rehash过程中,每处理⼀个请求时,从哈希表1中的第 ⼀个索引位置开始,顺带着将这个索引位置上的所有entries拷贝到哈希表2中,这个请求是读请求还是写请求?

这个请求可以是读请求,也可以是写请求

无论是读请求还是写请求,只要涉及到访问 hash 数据结构,Redis 都会进行这个渐进式迁移的动作。

如果渐进式时,这些的key突然都不访问了 会有什么问题
  • 如果 hash 中的 key 在 rehash 期间完全没有访问,那么 rehash 的进度会非常缓慢。
  • 为了解决这个问题,Redis 会在处理查询/更新请求时,优先将对应 key 所在槽位的数据迁移到新哈希表。
  • 这样可以确保热点数据能够尽快完成迁移,提高 rehash 的效率。

为啥redis的rehash采用渐进式,而hashmap是一次性rehash
  • Java 的 HashMap 采用一次性 rehash 是因为它是单机内存数据结构,不需要考虑服务可用性。
  • 而 Redis 作为分布式缓存,需要在保证服务高可用的同时,完成动态扩容,所以采用了渐进式的 rehash 机制。

    后期新的八股文合集文章会继续分享,感兴趣的小伙伴可以点个关注~

 更多精彩内容以及免费资料请关注公众号:绝命Coding

914cbb12b2c3492aaa31232a11aa9c64.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/802430.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL使用(二)

说明:本文介绍PostgreSQL的DML语言; 插入数据 -- 1.全字段插入,字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入,字段名必须写全 insert into tb_student (id, name) values (2,…

Windows 11几个常用的快捷键

WinQ/WinS:快速打开一键搜索 WinCtrlD:快速新建虚拟桌面。可以通过四根手指在触摸板划动进行切换,也可以通过WinTAB进行虚拟桌面切换 WinTAB:虚拟桌面切换 WinA:打开快速设置面板 WinD:快速切换到桌面&a…

springboot+vue+mybatis鲜花管理系统+PPT+论文+讲解+售后

随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,鲜花管理系统当然也不能排除在外。鲜花管理系统是以实际运用为开发背景,运用软件工程开发方法,采用SSM技…

如何建设微模块数据中心机房

建设微模块数据中心机房涉及多个步骤和技术要点,以下是基于现代技术和行业最佳实践的建设流程概览: 1. 需求分析与规划 确定需求:分析业务需求,包括IT容量、电力、冷却和空间需求。 选址评估:选择靠近关键基础设施的位…

秋招突击——7/16——复习{滑动窗口——无重复最长子串}——新作{相交链表,环形链表,滑动窗口——找到字符串中所有字母异位词}

文章目录 引言模板——滑动窗口/双指针复习无重复最长子串复习实现 新作相交链表个人实现参考实现 环形链表个人实现参考实现——快慢指针 找到字符串中所有字母的异位词个人实现参考实现 总结 引言 今天本来想完成指标的,但是做着做着,发现大部分做的比…

Day07-ES集群加密,kibana的RBAC实战,zookeeper集群搭建,zookeeper基本管理及kafka单点部署实战

Day07-ES集群加密,kibana的RBAC实战,zookeeper集群搭建,zookeeper基本管理及kafka单点部署实战 0、昨日内容回顾:1、基于nginx的反向代理控制访问kibana2、配置ES集群TSL认证:3、配置kibana连接ES集群4、配置filebeat连接ES集群5、配置logsta…

用go实现限流算法

文章目录 固定窗口优缺点:适用场景:总结: 滑动窗口优缺点:适用场景:总结: 漏桶限流器优缺点:适用场景:总结: 令牌桶优缺点:适用场景:总结&#xf…

保障低压设备安全!中国星坤连接器精密工艺解析!

在现代电子设备中,连接器扮演着至关重要的角色,它们是电子系统之间沟通的桥梁。随着技术的发展,对连接器的需求也在不断提升,特别是在低电压应用领域。中国星坤最新推出的低压连接器,以其精密性和安全性,为…

AI算法18-最小角回归算法Least Angle Regression | LARS

​​​ 最小角回归算法简介 最小角回归(Least Angle Regression, LAR)是一种用于回归分析的统计方法,它在某些方面类似于最小二乘回归,但提供了一些额外的优点。最小角回归由Bradley Efron等人提出,主要用于处理具有…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…

如何用一个例子向10岁小孩解释高并发实时服务的单线程事件循环架构

I/O密集型进程和CPU密集型进程 聊天应用程序、MMO(大型多人在线)游戏、金融交易系统、等实时服务需要处理大量并发流量和实时数据。 这些服务是I/O密集型的,因为它们花费大量资源处理输入输出操作,例如高吞吐量、低延迟网络通信…

泉盛UV-K5扩容2Mbit EEPROM

泉盛UV-K5扩容2Mbit EEPROM 步骤 分离前面板与背板。 拆下电池,底部有个空隙,从缝隙撬开背板。分离前面板时注意喇叭连接线,不要扯断了。 分离屏幕。 先从箭头位置向上挑起,屏幕稍微松动即可左右晃动,直至完全取出。注…

leetcode日记(40)N皇后

一开始没看到不能同斜线,以为只要不同行不同列就行,本来想先列出每一行的Q都不同位置的棋盘然后进行排列组合就行,后来才发现还有限制(后来又想了一下,感觉可以先用这种思路然后去除有同一斜线的棋盘摆列) …

【手写数据库内核组件】0501多线程并发模型,任务分发多工作者执行架构实现,多线程读写状态时volatile存储类型使用技巧

0501 多线程管理 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 0501 多…

2024年金航标和萨科微扩张

近年电子信息产业链的外迁和世界经济的低迷,各行各业都很卷,加班加点但业绩负增长是常态,互联网大厂阿里巴巴大裁员、字节跳动裁到了大动脉、京东刘强东抛弃躺平的兄弟、深圳华强北做电子元器件的老板老板娘们一脸茫然,周围都弥漫…

使用工作日志 - 更快地恢复专注并理清思路

原文:Charles Fval - 2024.07.12 你正在处理计算机科学中最复杂的问题:修复部署管道上的权限。这已经是你开始处理这个简单任务的第 4 天了。你的经理明确告诉你,你在这方面的表现远低于她对一个中期实习生的期望。你的同事们都尽量远离你&a…

华为OD 机试真题 - 分割均衡字符串(Python)

题目描述 均衡串定义:字符串只包含两种字符,且两种字符的个数相同。 给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的’X"和’Y’两种字符。 输入描述 均衡串:XXYYXY 字符串的长度[2,10000]。给定的字符…

南京邮电大学统计学课程实验2 用EXCEL进行参数估计假设检验 指导

一、实验描述 实验目的 1、学会用Excel进行参数估计; 2、学会用Excel进行z检验-双样本平均差检验; 实验环境 实验中使用以下软件和硬件设备 (1)Windows XP操作系统; (2)PC机、EXCEL软件&…

[Vulnhub] digitalworld.local-JOY snmp+ProFTPD权限提升

信息收集 IP AddressOpening Ports192.168.101.150TCP:21,22,25,80,110,139,143,445,465,587,993,995 $ nmap -p- 192.168.101.150 --21,22,25,min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP logi…

Python 面向对象编程,创建类和对象

面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计范式,旨在提高软件的可维护性、可扩展性和复用性。OOP 的核心思想是将数据和操作这些数据的代码封装在一起,通过类和对象来组织程序,使程…