redis:字典實現及rehash原理
字典只使用ht[0]雜湊表,ht[1]雜湊表只會在對ht[0]雜湊表進行rehash時使用
鍵---->雜湊值---->索引值
Redis使用MurmurHash演算法,優點:即使輸入的鍵有規律,演算法仍然能給出一個好的隨機分佈性,速度塊。
解決鍵衝突:鏈地址法。每個雜湊表節點都有一個next指標,多個雜湊表節點可以用next指標構成一個單向連結串列。程式總是將新節點新增到連結串列的表頭位置O(1)
負載因子--->雜湊表的拓展和收縮。
擴充套件:ht[1]的大小為第一個大於等於ht[0].used*2的2^n
收縮: ht[1]的大小為第一個大於等於ht[0].used的2^n
將ht[0]包含的所有鍵值對都遷移到ht[1]之後,ht[0]變為空表,釋放ht[0],將ht[1]設定為ht[0],並在ht[1]新建立一個空白雜湊表,為下一次rehash做準備
沒有執行BGSAVE命令或BGREWRITEAOF命令:負載因子大於等於1 擴充套件與收縮
正在執行BGSAVE命令或BGREWRITEAOF命令:負載因子大於等於5擴充套件與收縮
rehash:分多次地,漸進式地完成
除了程式每次對字典執行指定操作時,還會順帶將ht[0]雜湊表在rehashidx索引上的所有鍵值對rehash到ht[1]。
參考:《Redis設計與實現》