日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis源码阅读--hashTable

發布時間:2025/3/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis源码阅读--hashTable 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

公司有個項目用到hash,同事從redis的代碼里摳了hashTable的源碼出來,最近抽空看了一下,設計還是很精妙的。 現在把閱讀的結果寫寫,以備后面復習可用(記得之前看過一次,后來長時間沒看了就忘記了,這次再看基本要從頭開始)

源碼位置

  • dict.h
  • dict.c

圖示

(摘自redis設計與實現) 參考這里

設計思路

  • 這個hash(字典)他包含了兩個table,為什么有兩個呢?那是因為他要實現自動擴展,每次要add新元素的時候都要 判斷一下是否需要擴展(expand)
  • 兩個table再掛上2的倍數(size) 的桶,每個桶都是一個鏈表。
  • 當達到條件需要擴展的時候,一般是元素的個數和桶的比例差不多是1:1, 那就將第一個table生成第一個的size *2 為什么要是2的倍數呢?有幾個好處:1.分布更均勻 2.碰撞幾率更小 但是還有一個更重要的原因是: a%b可以替換成了a&(b-1) ,當hashtable的長度是2的冪的情況下。這樣運算速度可以提高很多,具體可以參考這里
  • 當新的table生成后,桶數擴大了一倍,這樣就大大地減少了碰撞,但是就帶來了一個原來的數據是rehash的問題
  • 當rehash開始后,如果有增,刪,查的操作,每次都搬一個桶到新的table上,如果已經開始rehash,那么,新增的元素就直接插到新的桶上
  • 當rehash全部完成后,舊talbe釋放掉,新table接替舊table成為主力工作。
  • 還給hash設置了迭代器(iterators), 當有迭代器存在的時候,為了安全就不進行rehash的步驟。

參考資料

  • 為啥要用位運算代替取模呢
  • 圖解redis之數據結構篇

轉載于:https://my.oschina.net/mawx/blog/893393

總結

以上是生活随笔為你收集整理的redis源码阅读--hashTable的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。