面试题答案
一键面试Redis字典渐进式rehash机制
Redis字典采用渐进式rehash机制,是为了避免在数据量较大时,一次性rehash带来的性能问题。
代码实现中不影响正常读写操作逐步完成rehash
- rehashidx变量的使用:
- Redis的字典结构
dict
中有一个rehashidx
变量。当rehashidx
为-1
时,表示当前没有进行rehash操作。 - 开始rehash时,
rehashidx
被设置为0
,并逐步递增。
- Redis的字典结构
- 数据迁移的具体步骤:
- 当需要进行rehash时,Redis会分配一个新的哈希表(大小通常是原哈希表的两倍)。
- 每次在执行字典的插入、删除、查找或更新操作时,除了正常执行这些操作外,还会顺带将
ht[0]
中rehashidx
索引位置上的所有键值对迁移到ht[1]
中。 - 迁移完成后,
rehashidx
自增1。 - 当
rehashidx
递增到ht[0].used
(即ht[0]
中所有元素都迁移完毕)时,将ht[0]
指向ht[1]
,释放ht[1]
,并将rehashidx
重新设为-1
,标志着rehash完成。
- 处理并发访问:
- 读操作:在渐进式rehash过程中,读操作会同时在
ht[0]
和ht[1]
中查找。因为在迁移过程中,部分数据在ht[0]
,部分在ht[1]
,所以需要在两个哈希表中都进行查找以确保能找到目标数据。 - 写操作:在插入、删除、更新操作时,新数据会直接写入
ht[1]
,而不会写入ht[0]
。这样能保证在rehash完成后,ht[0]
可以被顺利释放。同时,这些操作会顺带执行渐进式rehash,迁移部分数据,以逐步完成整个rehash过程。
- 读操作:在渐进式rehash过程中,读操作会同时在
通过这种方式,Redis在不影响正常读写操作的情况下逐步完成rehash,保证了系统的高性能和稳定性。