- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
2023-06-17:说一说redis中渐进式rehash?
答案2023-06-17:
在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率。为了解决这个问题,Redis会对数组进行扩容,通常是将数组大小扩大为原来的两倍。然而,这个扩容过程会引起元素在哈希桶中的分散,导致元素的移动。由于元素移动会涉及IO操作,所以这个重新哈希(ReHash)过程可能会导致许多请求被阻塞.
为了避免这个问题,Redis 采用了渐进式 rehash.
在Redis中,默认使用两个全局哈希表:哈希表1和哈希表2。最初,当你开始插入数据时,只使用哈希表1,而哈希表2没有分配空间。随着数据逐渐增多,Redis开始执行渐进式rehash的过程.
1、为哈希表2分配更大的空间,例如是当前哈希表1大小的两倍.
2、将哈希表1中的数据重新映射并拷贝到哈希表2中,确保每个元素都被正确地存储在新的哈希桶位置上.
3、释放哈希表1的空间,将其回收以便于系统的正常运行.
在上述的第二步中,涉及到大量的数据迁移和拷贝操作。如果一次性将哈希表1中的所有数据都迁移到哈希表2,将导致Redis线程被阻塞,无法提供对其他请求的服务。这将导致Redis无法快速地访问数据.
在Redis开始执行rehash时,Redis仍然可以正常处理客户端请求。然而,在处理每个请求时,Redis还会额外执行以下操作:
处理第一个请求时,将哈希表1中第一个索引位置上的所有条目拷贝到哈希表2中.
处理第二个请求时,将哈希表1中第二个索引位置上的所有条目拷贝到哈希表2中.
如此循环,直到将所有索引位置上的数据都成功拷贝到哈希表2中.
通过将大量数据拷贝的操作分摊到处理请求的过程中,Redis巧妙地避免了一次性的大量数据拷贝开销,从而保证了数据的快速访问。这种处理方式确保了根据键寻找值的操作大致在O(1)的时间复杂度范围内进行。通过渐进式rehash和分步式数据迁移,Redis能够在维持性能的同时,实现平滑的哈希表扩容和数据迁移.
最后此篇关于2023-06-17:说一说redis中渐进式rehash?的文章就讲到这里了,如果你想了解更多关于2023-06-17:说一说redis中渐进式rehash?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在某些时候我们需要增加散列的大小,通常我们只是重新散列,这会导致整个散列的重新构造。 有没有更好的解决方案,当我们增加尺寸时,我们不需要重新构造整个东西? 最佳答案 你可以使用 http://en.w
我正在实现一个哈希表,而不使用任何内置的 java HashTable 功能,并收到以下行的编译时错误: newHashTable.add(reHashValueIndex, bucket.get(j
我们有一个运行着多个数据库的 MySQL 服务器,用于不同类型的数据。其中之一是 wordpress 数据库。 我可以连接正常,“显示数据库”,“使用苹果”,“使用橙子”等(用水果代替我们的实际数据库
HashMap 的文档中有这样的短语: If the initial capacity is greater than the maximum number of entries divided by
我正在使用Kibana 4在ElasticSearch上查询唯一计数。 我想prevent rehash on field,,因为该字段已经被散列了。 如何使Kibana使用"rehash": fal
我对散列和重新散列有些困惑。以下是我的理解,如有错误请指正。 从图片上看,bucket实际上是Entry类的数组,以链表的形式存储元素。每个新的键值对,其键具有与条目数组桶相同的哈希码,将作为条目对象
我不明白为什么 hastable 的 rehash 复杂度在最坏的情况下可能是二次的: http://www.cplusplus.com/reference/unordered_set/unorder
我了解 unordered_ STL 容器保留多个桶,桶的数量根据容器中元素的数量而变化。插入时,如果超过一定的限制,容器将重新散列以使用更多的桶,因此每个桶都不太满并且搜索速度更快。这会使迭代器无效
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我们的数据库有很多表和很多列。命令行 mysql 客户端需要很长时间才能连接,除非我通过它 -A。我不想每次都输入它,所以我尝试添加 my.cnf 选项 no-auto-rehash。 在我必须使用
我试图让我的 Ruby 1.9.3 运行我的 Octopress 安装。 当我输入时: rbenv rehash 我遇到了一个错误: rbenv: cannot rehash: /Users/m
C++ unordered_map 的rehash() 和reserve() 方法有什么区别?为什么需要两种不同的方法? 最佳答案 区别在于目的,尽管两者都在做类似的事情。 rehash 获取现有映射
我不明白为什么它不是线性的。 关于多重集的类似问题有一个很好的答案: why hastable's rehash complexity may be quadratic in worst case 但
我正在将用户从遗留用户存储迁移到我的 ASP.NET 5.0 Web 应用程序中的 ASP.NET Identity 2.0。我有一种验证遗留哈希的方法,但我想在登录时将它们升级到 ASP.NET I
我正在尝试在安装新 gem 后重新哈希 rbenv它在我的 ubuntu 服务器上给了我这些错误 rbenv: cannot rehash: /home/deployer/.rbenv/shims/
我是一名优秀的程序员,十分优秀!