Redis 源码解读之 Rehash 的调用时机
# Redis 源码解读之 Rehash 的调用时机
## 背景和问题
本文想要解决的问题
1. 什么时机触发 Rehash 操作?
2. 什么时机实际执行 Rehash 函数?
## 结论
1. 什么时机触发 Rehash 操作?
> * **缩容**: Redis 定时任务 `serverCron` 会在每个周期内检查 bucket 的使用情况。当存放 key 的数量和总 bucket 数的比例是否小于 `HASHTABLE_MIN_FILL(10%)`,触发缩容 Rehash 操作。
> * **扩容**:在每次调用 `dictAddRaw` 新增数据时,会检查 bucket 的使用比例。扩容的条件是以下之一:
> * `dict_can_resize = 1` (该参数会在有 COW 操作的子进程运行时更新为 0,防止在子进程操作过程中触发 Rehash,导致内核进行大量的 Page 复制操作)
> * 当前存放的 key 的数量与 bucket 数量的比例超过了 `dict_force_resize_ratio(5)`
2. 什么时机实际执行 Rehash 函数?
> * **定时任务**: Redis 定时任务 `serverCron` 会在每个周期内执行 1ms 渐进式Rehash 操作。
> * **附着于其他操作**:在 Redis 执行 `dictAddRaw`, `dictGenericDelete`, `dictFind`, `dictGetSomeKeys` 和 `dictGetRandomKey` 等操作前会执行 Rehash 操作。
## 源码分析
Redis Rehash机制
#技术交流##Redis#
## 背景和问题
本文想要解决的问题
1. 什么时机触发 Rehash 操作?
2. 什么时机实际执行 Rehash 函数?
## 结论
1. 什么时机触发 Rehash 操作?
> * **缩容**: Redis 定时任务 `serverCron` 会在每个周期内检查 bucket 的使用情况。当存放 key 的数量和总 bucket 数的比例是否小于 `HASHTABLE_MIN_FILL(10%)`,触发缩容 Rehash 操作。
> * **扩容**:在每次调用 `dictAddRaw` 新增数据时,会检查 bucket 的使用比例。扩容的条件是以下之一:
> * `dict_can_resize = 1` (该参数会在有 COW 操作的子进程运行时更新为 0,防止在子进程操作过程中触发 Rehash,导致内核进行大量的 Page 复制操作)
> * 当前存放的 key 的数量与 bucket 数量的比例超过了 `dict_force_resize_ratio(5)`
2. 什么时机实际执行 Rehash 函数?
> * **定时任务**: Redis 定时任务 `serverCron` 会在每个周期内执行 1ms 渐进式Rehash 操作。
> * **附着于其他操作**:在 Redis 执行 `dictAddRaw`, `dictGenericDelete`, `dictFind`, `dictGetSomeKeys` 和 `dictGetRandomKey` 等操作前会执行 Rehash 操作。
## 源码分析
Redis Rehash机制
#技术交流##Redis#