Redis 的 rehash 過程是為了擴大哈希表的大小以適應更多的鍵值對。在這個過程中,為了保證數據一致性,Redis 采取了以下策略:
漸進式 rehash:Redis 不會立即對整個哈希表進行 rehash,而是采用漸進式的策略。在 Redis 的正常操作過程中,會逐步將舊哈希表中的鍵值對遷移到新的哈希表中。這樣,即使在 rehash 過程中,Redis 仍然可以正常處理請求,從而保證數據一致性。
在 rehash 過程中,Redis 會使用兩個哈希表:舊的哈希表(oldhash)和新的哈希表(newhash)。在 rehash 的初期,大部分鍵值對仍然存儲在舊的哈希表中,而新的哈希表則逐漸填充從舊哈希表中遷移過來的鍵值對。當新的哈希表中的鍵值對數量達到一定閾值(例如,舊哈希表的 2/3)時,Redis 會將新的哈希表設置為當前的哈希表,并開始使用新的哈希表進行存儲操作。此時,舊哈希表中的鍵值對已經基本遷移完成,因此可以安全地刪除舊哈希表。
在整個 rehash 過程中,Redis 會確保新舊哈希表的數據一致性。在遷移鍵值對的過程中,如果發生錯誤(例如,鍵值對在遷移過程中丟失),Redis 會自動停止 rehash 過程,并在下次操作時繼續遷移剩余的鍵值對。這樣可以確保在 rehash 過程中不會出現數據丟失的情況。
通過以上策略,Redis 的 rehash 過程可以在保證數據一致性的同時,高效地擴大哈希表以適應更多的鍵值對。