Redis 的 Rehash 操作详解

Redis 的Rehash是其哈希表(dict)实现中的核心机制,用于在动态扩容或缩容时保持高性能的查找效率。

一、Rehash 的定义与目的

特性

说明

定义

将哈希表中所有键值对重新哈希到一张新的、大小合适的哈希表中,并逐步迁移的过程。

目的

1.扩容:当负载因子(used / size)超过阈值(通常为 1)时,自动触发扩容,以降低哈希冲突,提升性能。 2.缩容:当负载因子过低时,可触发缩容以节省内存。

触发条件

1.自动触发:执行插入操作时,若负载因子超过dictHashMaxLoadFactor(默认 1),则自动开始 rehash。 2.手动触发:通过dictResize命令可手动调整哈希表大小。

二、Rehash 的工作机制

Redis 的 rehash 采用**渐进式(渐进式 rehash)**策略,这是其高性能的关键。

1. 渐进式 Rehash 流程

步骤

说明

1. 创建新表

当触发 rehash 时,Redis 会创建一张新的哈希表(ht[1]),其大小通常是原表(ht[0])的 2 倍(扩容时)。

2. 双表并存

在 rehash 完成前,新旧两张哈希表同时存在,所有操作(查找、插入、删除)都会在这两张表上进行。

3. 渐进迁移

每次执行命令时,Redis 会迁移固定数量的键值对(例如 5 个)从ht[0]ht[1]。这避免了单次 rehash 造成的长时间阻塞。

4. 完成迁移

当所有键值对迁移完毕,旧表ht[0]被释放,ht[1]成为新的ht[0],rehash 状态结束。

2. 查找与操作逻辑

操作

在 rehash 期间的处理方式

查找

先在ht[0]中查找,若未找到,再在ht[1]中查找。

插入

键值对只插入到ht[1]中。

删除

ht[0]ht[1]中同时删除。

这种设计保证了 rehash 过程中不会阻塞主线程,所有操作都能在 O(1) 平均时间复杂度内完成。

三、Rehash 与指纹信息的关系

Redis 的字典指纹在 rehash 过程中会发生变化。

场景

指纹变化

原因

插入/删除键值对

变化

字典的used计数改变。

触发 rehash

变化

哈希表大小、指针地址等状态改变。

rehash 过程中

持续变化

随着键值对逐步迁移,字典状态动态变化。

这意味着,在 rehash 期间,依赖字典指纹的安全迭代器dictGetSafeIterator)需要特别注意,因为迭代过程中指纹可能已改变,可能导致迭代结果不一致或需要重新开始。
posted @ 2026-04-14 18:16  飘飘雪  阅读(63)  评论(0)    收藏  举报