Redis 的Rehash是其哈希表(dict)实现中的核心机制,用于在动态扩容或缩容时保持高性能的查找效率。
一、Rehash 的定义与目的
|
特性 |
说明 |
|
定义 |
将哈希表中所有键值对重新哈希到一张新的、大小合适的哈希表中,并逐步迁移的过程。 |
|
目的 |
1.扩容:当负载因子( |
|
触发条件 |
1.自动触发:执行插入操作时,若负载因子超过 |
二、Rehash 的工作机制
Redis 的 rehash 采用**渐进式(渐进式 rehash)**策略,这是其高性能的关键。
1. 渐进式 Rehash 流程
|
步骤 |
说明 |
|
1. 创建新表 |
当触发 rehash 时,Redis 会创建一张新的哈希表( |
|
2. 双表并存 |
在 rehash 完成前,新旧两张哈希表同时存在,所有操作(查找、插入、删除)都会在这两张表上进行。 |
|
3. 渐进迁移 |
每次执行命令时,Redis 会迁移固定数量的键值对(例如 5 个)从 |
|
4. 完成迁移 |
当所有键值对迁移完毕,旧表 |
2. 查找与操作逻辑
|
操作 |
在 rehash 期间的处理方式 |
|
查找 |
先在 |
|
插入 |
键值对只插入到 |
|
删除 |
从 |
这种设计保证了 rehash 过程中不会阻塞主线程,所有操作都能在 O(1) 平均时间复杂度内完成。
三、Rehash 与指纹信息的关系
Redis 的字典指纹在 rehash 过程中会发生变化。
|
场景 |
指纹变化 |
原因 |
|
插入/删除键值对 |
变化 |
字典的 |
|
触发 rehash |
变化 |
哈希表大小、指针地址等状态改变。 |
|
rehash 过程中 |
持续变化 |
随着键值对逐步迁移,字典状态动态变化。 |
这意味着,在 rehash 期间,依赖字典指纹的安全迭代器(dictGetSafeIterator)需要特别注意,因为迭代过程中指纹可能已改变,可能导致迭代结果不一致或需要重新开始。