Redis 四 字典 漸進式hash

2021-08-20 03:40:52 字數 1164 閱讀 2926

本篇接著上面redis的字典進行繼續分析,主要講解redis字典裡面是如何實現漸進式hash的策略的。

漸進式hash

聽名字就很容易參透出來是什麼意思,漸進的意思就是不一步到位,而是慢慢的操作。慢慢的計算出hash值。這個redis的動作並不是一次性,集中性的完成,而是分多次,漸進式的完成的。

這樣做的原因在於,如果ht[0]裡儲存的鍵非常少,那麼伺服器可以在瞬間就將這些鍵值對全部rehash到ht[1]。但是,如果雜湊表裡面儲存的鍵值對數量非常多,幾百萬,幾千萬甚至上億個。那麼要一次性將這些鍵值對全部rehash到ht[1]的話,龐大的計算量可能會導致伺服器在一段時間內停止服務。

因此,為了避免rehash對伺服器效能造成影響,伺服器不是一次性將ht[0]裡面所有的值對都全部rehash到ht[1],而是分多次,漸進式的將ht[0]裡面的值對慢慢地rehash到ht[1]。

詳細步驟:

1)為ht[1]分配空間,讓字典同時持有ht[1]和ht[0]兩個雜湊表。

2)在字典中維持乙個索引計數器變數rehashidx,並將它的值設定為0,表示rehash工作正式開始

3)在rehash期間,每次對字典的執行新增,刪除,查詢或者更新操作時,程式除了執行指定的操作外,還會順帶將ht[0]雜湊表在rehashidex索引上的所有鍵值對rehash到[1],當rehash完成,程式將rehashidx屬性的值增一。

4)隨著字典操作的不斷執行,最終在某個時間點上,ht[0]的所有鍵值對都會被rehash至ht[1],這時程式將rehashidex屬性的值設定為-1,表示rehash操作已完成。

漸進式rehash的好處在於它採取分而治之的方式,將rehash鍵值對所需的計算工作均攤到了對字典的每個新增,刪除,查詢和更新操作上,從而避免了集中式rehash而帶來的龐大計算量。

漸進式rehash執行期間的雜湊表操作

因為在漸進式rehash的過程中,字典會同時使用ht[0],ht[1]兩個雜湊表,所以在漸進式rehash期間,字典的刪除,查詢,更新等操作會在兩個雜湊表上進行,例如,要在字典裡面查詢乙個鍵的話,程式會先在ht[0]裡面進行查詢,如果沒找到,則會繼續到ht[1]裡面進行查詢,諸如此類。

另外,在漸進式rehash執行期間,新新增到字典的鍵值對一律儲存到ht[1]當中,而ht[0]則不再進行任何新增操作,這一措施保證了ht[0]包含的鍵值對數量會只減不增。並隨著rehash的操作,最後變為空表。

Python學習四 字典

在python中,字典是一系列鍵 值對。每個鍵都與乙個值相關聯,你可以使用鍵來訪問與之相關的值。事實上,可將任何python物件用作字典中的值,例如數字 字串 列表 甚至是字典。例項 alien print alien age 輸出17 user 0 for key,value in user 0....

python學習筆記(四)字典

個人筆記,僅供參考 字典通過鍵值對來儲存資料,經常用來儲存有關聯的幾組資料。在需要處理較多資料時用的很頻繁 字典通過以下方式建立 phonebook 整個字典有大括號括起,一對鍵值對使用冒號連線,各個鍵值對之間用逗號分隔。可使用dict從其他對映 如其他字典 或鍵值對序列建立字典 items nam...

筆記四 字典 鍵值對 集合 if函式

建立 a dict name 內容 其他 利用元組 a name 內容 內容 zip函式 a b dict zip a,b 若想訪問 a 鍵 a.get 鍵 不存在 表示如果鍵不存在,返回值為不存在 獲得所有鍵值對 a.items 獲得所有鍵 a.keys 獲得所有值 a.values a key ...