惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Jina AI
Jina AI
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
博客园 - 司徒正美
罗磊的独立博客
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Vercel News
Vercel News
A
About on SuperTechFans
I
InfoQ
D
DataBreaches.Net
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队

博客园 - 飘飘雪

Panic 与 Crash 的区别 vscode常用快捷键大全 网络流量单位 Core文件作用、设置及用法 linux批量执行工具omnitty安装及使用 linux 下误改了/etc/profile下的文件path路径导致整个系统用不了命令 python安装 linux less和more命令用法 Tair中对热key的内部处理 Tair中对大key的内部处理方式 redis的redis-benchmark用法 redis的memtier-benchmark用法 阿里巴巴的缓存类测试产品及有缺点 如何在class文件中使用pom中profile级别的 <properties> profiles下的properties与properties有什么区别 Guava 工具类之 Splitter的使用 什么是“黑天鹅”和“灰犀牛” java-sdk接口测试覆盖率统计实践 java应用接口自动化覆盖率统计实践
Redis 的 Rehash 操作详解
飘飘雪 · 2026-04-14 · via 博客园 - 飘飘雪

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

特性

说明

定义

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

目的

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

触发条件

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

Redis 的 rehash 采用**渐进式(渐进式 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 状态结束。

操作

在 rehash 期间的处理方式

查找

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

插入

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

删除

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

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

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

场景

指纹变化

原因

插入/删除键值对

变化

字典的used计数改变。

触发 rehash

变化

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

rehash 过程中

持续变化

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

这意味着,在 rehash 期间,依赖字典指纹的安全迭代器dictGetSafeIterator)需要特别注意,因为迭代过程中指纹可能已改变,可能导致迭代结果不一致或需要重新开始。