文章内容收录到个人网站,方便阅读:http://hardyfish.top/
文章内容收录到个人网站,方便阅读:http://hardyfish.top/
文章内容收录到个人网站,方便阅读:http://hardyfish.top/
Redis 的渐进式 rehash 是一种哈希表扩容方法,用于在数据增长时逐步将元素迁移到新的哈希表,而不影响系统的正常读写操作。以下是 Redis 渐进式 rehash 的详细过程和优势。
Redis 渐进式 Rehash 的基本原理
Redis 的哈希表结构在元素增多时会触发扩容(通常将数组大小扩大一倍)。为了将元素重新分配到新表位置,Redis 使用了两张哈希表(哈希表1和哈希表2),并通过分步完成的渐进式 rehash 来避免一次性迁移带来的性能问题。
渐进式 Rehash 过程
- 开始 Rehash:当 Redis 的哈希表达到负载因子限制(元素数量与数组长度的比例)时,触发扩容,创建一个容量为旧表两倍的新哈希表(哈希表2)。
- 分步迁移数据:Redis 不会一次性将哈希表1中的数据全部迁移到哈希表2中,而是将迁移任务分摊到后续的增删查改操作中。每次操作触发时,从当前
rehashindex
(记录迁移位置)位置开始,将哈希表1的一个桶中的所有数据迁移到哈希表2,然后将rehashindex
+1。 - 继续渐进式迁移:随着更多的增删改查操作,每次逐步迁移哈希表1的下一个桶,直到所有元素都被迁移完成。
- 完成 Rehash:当所有元素都迁移至哈希表2后,哈希表1被清空,哈希表2成为新的哈希表,
rehashindex
被重置,后续操作在新的哈希表1上进行。
渐进式 Rehash 查询过程
在 rehash 过程中,为了保证所有键都能被查询,Redis 同时维护两个哈希表:
- 查询操作:每次查询时,Redis 会先在哈希表1中查找键;若未找到,再在哈希表2中查找。随着 rehash 的进行,更多数据会被迁移到哈希表2中,直到最终所有查询只需访问新表。
渐进式 Rehash 的优势
Redis 的渐进式 rehash 避免了一次性扩容带来的 I/O 负担和阻塞现象,使得在大规模数据扩容时,系统仍能持续响应读写操作,避免了传统哈希表扩容对性能的明显影响。