擴容步驟
先將儲存在ht[0]中的所有鍵值對 rehash到ht[1]中:rehash就是重新計算key的hash值和索引值,然後將鍵值對放置到ht[1]雜湊表的指定位置上
當ht[0]包含的所有鍵值對都遷移到了ht[1]後(ht[0]變為空表),釋放ht[0],將ht[1]設定為ht[0],並將ht[1]新建乙個空白雜湊表,為下一次rehash做準備。
漸進式rehash
-如果雜湊表中存在這幾百萬,幾千萬,幾億的資料時,那麼一次性將這些鍵值對全部rehash到ht[1]的話,會導致一段事件內redis伺服器停止對外服務
步驟:為ht[1]分配空間,讓字典同時擁有兩個雜湊表
在字典中維持乙個rehashidx變數設為0,表示rehash正式開始
在rehash期間,每次對字典進行新增,刪除,查詢或者更新操作時,程式除了執行指定的操作外,還會順帶將將ht[0]雜湊表在rehashidx索引上的所有鍵值對rehash到ht[1],當rehash工作完成後,程式將rehashidx屬性+1隨著字典操作不斷執行,最終在某個時間點上,ht[0]的所有鍵值對都會rehash至ht[1],這時程式會將rehash屬性的值設為-1,表示rehash操作已完成
好處:漸進式rehash的好處在於他採取分而治之的方式,將rehash鍵值對所需要的計算工作均攤到對字典的每個新增、刪除、查詢和更新操作上,從而避免集中式rehash而帶來的龐大的計算量。
rehash期間的操作:
漸進式rehash期間,字典的刪除、查詢、更新等操作會在兩個雜湊表上進行。例如:要在字典裡面找乙個key,程式會先在ht[0]裡進行查詢,如果沒找到,就會繼續到ht[1]中進行查詢漸進式rehash期間,新新增到字典的鍵值對一律會儲存到ht[1]裡,ht[0]則不會進行任何新增操作,這保證了ht[0]包含的鍵值對數量只減不增,並伴隨這rehash操作的執行,最終變成空表
字典雜湊表的實現原理 Redis雜湊表的設計與實現
今天要介紹的資料結構,是redis中的雜湊表,這種資料結構是redis中非常重要的一種資料型別,可以方便的處理很多複雜場景的業務需求。雜湊表的結構定義在 dict.h 檔案中,我們抽取 檢視一下 如圖所示,雜湊表是乙個結構體型別,包含四個成員屬性 由上圖我們已經知道,雜湊表的定義中包含乙個table...
Redis原始碼研究 雜湊表
前面提到 redis是個key value儲存系統,學過資料結構的人都知道,key value最簡單的資料結果就是雜湊表 當然,還有其他方式,如b 樹,二叉平衡樹等 hash表的效能取決於兩個因素 hash表的大小和解決衝突的方法。這兩個是矛盾的 hash表大,則衝突少,但是用記憶體過大 而hash...
Redis對雜湊表的操作
1,同時設定多個值 127.0.0.1 6379 1 hmset userinfo username admin pssword 123 school beida ok 127.0.0.1 6379 1 hgetall userinfo 1 username 2 admin 3 pssword 4 ...