首页 > 数据库 >2023-06-17:说一说redis中渐进式rehash?

2023-06-17:说一说redis中渐进式rehash?

时间:2023-06-17 22:32:45浏览次数:59  
标签:rehash 06 请求 17 Redis 渐进式 哈希 数据

2023-06-17:说一说redis中渐进式rehash?

答案2023-06-17:

在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率。为了解决这个问题,Redis会对数组进行扩容,通常是将数组大小扩大为原来的两倍。然而,这个扩容过程会引起元素在哈希桶中的分散,导致元素的移动。由于元素移动会涉及IO操作,所以这个重新哈希(ReHash)过程可能会导致许多请求被阻塞。

渐进式rehash

为了避免这个问题,Redis 采用了渐进式 rehash。

在Redis中,默认使用两个全局哈希表:哈希表1和哈希表2。最初,当你开始插入数据时,只使用哈希表1,而哈希表2没有分配空间。随着数据逐渐增多,Redis开始执行渐进式rehash的过程。

1、为哈希表2分配更大的空间,例如是当前哈希表1大小的两倍。

2、将哈希表1中的数据重新映射并拷贝到哈希表2中,确保每个元素都被正确地存储在新的哈希桶位置上。

3、释放哈希表1的空间,将其回收以便于系统的正常运行。

在上述的第二步中,涉及到大量的数据迁移和拷贝操作。如果一次性将哈希表1中的所有数据都迁移到哈希表2,将导致Redis线程被阻塞,无法提供对其他请求的服务。这将导致Redis无法快速地访问数据。

2023-06-17:说一说redis中渐进式rehash?_数据

在Redis开始执行rehash时,Redis仍然可以正常处理客户端请求。然而,在处理每个请求时,Redis还会额外执行以下操作:

  • 处理第一个请求时,将哈希表1中第一个索引位置上的所有条目拷贝到哈希表2中。
  • 处理第二个请求时,将哈希表1中第二个索引位置上的所有条目拷贝到哈希表2中。
  • 如此循环,直到将所有索引位置上的数据都成功拷贝到哈希表2中。

通过将大量数据拷贝的操作分摊到处理请求的过程中,Redis巧妙地避免了一次性的大量数据拷贝开销,从而保证了数据的快速访问。这种处理方式确保了根据键寻找值的操作大致在O(1)的时间复杂度范围内进行。通过渐进式rehash和分步式数据迁移,Redis能够在维持性能的同时,实现平滑的哈希表扩容和数据迁移。

标签:rehash,06,请求,17,Redis,渐进式,哈希,数据
From: https://blog.51cto.com/moonfdd/6506551

相关文章

  • ABC306 Poisonous Full-Course
    Atcoder题目链接题目大意Takahashi要品尝\(N\)个菜品.这些菜品中有些是有毒的,有些是解药.当他吃下第\(i\)个菜品时,他的总美味值会增加\(Y_{i}\),同时有以下效果:如果吃下的菜品是有毒的(\(X_{i}=1\)),且他现在的胃是健康的,他的胃转变为不舒服的;如果他现在的胃已......
  • 2023-06-17:说一说redis中渐进式rehash?
    2023-06-17:说一说redis中渐进式rehash?答案2023-06-17:在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率。为了解决这个问题,Redis会对数组进行扩容,通常是将数组大小扩大为原来的两倍。然而,这个扩容过程会引起元素在哈希桶中的分散,导致元素的移动。......
  • Hugging News #0616: 有几项非常重要的合作快来围观、最新中文演讲视频回放发布!
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!重磅更新safetensors将成为保存模型的默......
  • AtCoder Beginner Contest 306
    A-Echo(abc306a)题目大意给定一个字符串,将每个字符输出两次。解题思路模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);intn;......
  • The baby-bust economy “婴儿荒”经济 | 经济学人20230603版社论双语精翻
    2023年6月3日《经济学人》(TheEconomist)封面文章暨社论(Leaders)精选:《“婴儿荒”经济》(“Thebaby-busteconomy”)。baby-bust即“婴儿荒”(生育低谷),与历史上1946~1964年间著名的baby-boom即“婴儿潮”(生育高峰)相对立。Thebaby-busteconomy“婴儿荒”经济Globalfertilityhascoll......
  • CF 1735 D. Meta-set
    题目链接:https://codeforces.com/contest/1735/problem/D代码链接:https://codeforces.com/contest/1735/submission/209958432给定n个长度为k的串(互不相同),求合法五元集的数量合法五元集定义为至少包含超过1个合法三元集合法三元集定义为三个串,三个串的属性要么全部相同,要么互......
  • [安乐椅#17] 函数对称性与周期性
    自对称&互对称自对称\(f(a+mx)=f(b-mx)\Leftrightarrowy=f(x)\)的图像关于直线\(x=\dfrac{a+b}{2}\)对称\((m\ne0)\).操作方法:将括号内两式取中点可得对称轴,即\(\dfrac{a+mx+b-mx}{2}=\dfrac{a+b}{2}\).互对称若\(I_{f(x)}=\mathbf{R}\),则\(y=f(a+mx)\)与......
  • JDK17与Hbase client的兼容性问题
    最近有1个项目升级到JDK17,里面用到了hbase-client(版本:以1.2.0-cdh5.7.1为基础,公司的大数据同学内部做了一些二次开发),启动时发现一直连不上集群,直接报错了,上hbase官网看了下:别说JDK17了,连JDK11都支持不完善,难道把JDK版本又降回去?有点不甘心,又搜索了一些资料,找到了几篇文档:htt......
  • 「Solution Set」06/16
    要没学上力!P9340[JOISC2023Day3]Tourismtrick:求虚树覆盖联通块的大小:将关键点按dfn排序,所覆盖到的边数为相邻两个关键点之间的边数和除以二(假设第一个和最后一个相邻)然后我们考虑回滚莫队,先把所有关键点弄下来按dfn排序,然后删掉点的时候就用链表计算贡献。完事了就......
  • 06. centos7使用docker方式安装gitlab
    gitlab初体验,使用docker进行快速安装,遇到了端口修改不生效的问题,在此记录一下。在正式环境中,gitlab的容器版,应该使用postgresql,redis,gitlab三个组件,使用标准的80端口,提供稳定且有性能的企业服务。但如果是在测试环境,或是想在一个机器上运行多个服务,则gitlab不一定能......