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]。