Redis 实战 - 渐进式 rehash

在 Redis 中,渐进式 rehash 是一种策略,用于在后台逐步完成哈希表的扩容或缩容,确保在进行 rehash 时不会阻塞主线程太长时间,影响 Redis 服务器的响应能力。以下是渐进式 rehash 的实战详解:

渐进式 rehash 过程

  1. 触发 rehash
    当 Redis 字典(dictionary)中的键值对数量增长到一定程度,负载因子(已存储键值对数量 / 哈希表大小)超过了预设阈值时,Redis 会启动 rehash 过程,目的是创建一个新的更大或更小的哈希表。

  2. 分配新哈希表
    Redis 会为字典分配一个新的哈希表(通常容量翻倍),将其命名为 ht[1],而原有的哈希表成为 ht[0]

  3. 渐进式迁移

    • 开始 rehash 过程时,Redis 不会立即一次性迁移所有键值对,而是设置一个全局变量 rehashidx,初始值为 0。
    • 在后续的读写操作(包括增删查改)过程中,每次操作前都会检查 rehashidx 是否小于 ht[0] 的大小。
    • rehashidx 小于 ht[0] 大小,Redis 就会从 ht[0]rehashidx 索引位置开始,将该索引所对应的链表中的所有键值对迁移到 ht[1] 相应的哈希桶中,并将 rehashidx 加一。
    • 这样,每次操作都会迁移一部分键值对,直到整个 ht[0] 中的所有键值对都被迁移到了 ht[1]
  4. 临时双表查询
    在 rehash 进行期间,字典会同时使用 ht[0]ht[1] 进行查找操作。如果在 ht[0] 中未找到目标键,Redis 会接着在 ht[1] 中查找,确保在此期间所有的键都能被正确访问。

  5. 完成 rehash
    rehashidx 达到 ht[0] 的大小时,说明 rehash 过程已完成。此时,Redis 会将 ht[1] 替代 ht[0] 成为新的主哈希表,并释放掉旧的 ht[0],同时重置 rehashidx-1,等待下次需要 rehash 时再次启用。

通过这种方式,Redis 能够在不影响主线程服务请求的情况下逐渐完成哈希表的扩容或缩容,极大地降低了对系统性能的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值