redis中的hash表采用的是渐进式hash的方式:
1、redis字典(hash表)底层有两个数组,还有一个rehashidx用来控制rehash
总结:
在扩容和收缩的时候,如果哈希字典中有很多元素,一次性将这些键全部rehash到ht[1]
的话,可能会导致服务器在一段时间内停止服务。所以,采用渐进式rehash的方式,详细步骤如下: - 为
分配空间,让字典同时持有ht[1]
和ht[0]
两个哈希表ht[1]
- 将
的值设置为 ,表示rehash工作正式开始rehashindex
- 在rehash期间,每次对字典执行增删改查操作是,程序除了执行指定的操作以外,还会顺带将
哈希表在ht[0]
索引上的所有键值对rehash到rehashindex
,当rehash工作完成以后,ht[1]
的值rehashindex
+1
- 随着字典操作的不断执行,最终会在某一时间段上
的所有键值对都会被rehash到ht[0]
,这时将ht[1]
的值设置为rehashindex
,表示rehash操作结束-1
index
大于 rehashindex
,访问 ht[0]
,否则访问 ht[1]。