Redis:rehash

Redis解決鍵沖突:使用的是鏈地址法

隨著操作的不斷執(zhí)行何鸡, 哈希表保存的鍵值對會逐漸地增多或者減少脑蠕, 為了讓哈希表的負(fù)載因子(load factor)維持在一個合理的范圍之內(nèi), 當(dāng)哈希表保存的鍵值對數(shù)量太多或者太少時呢蛤, 程序需要對哈希表的大小進(jìn)行相應(yīng)的擴(kuò)展或者收縮。

擴(kuò)展和收縮哈希表的工作可以通過執(zhí)行 rehash (重新散列)操作來完成, Redis 對字典的哈希表執(zhí)行 rehash 的步驟如下:

  1. 為字典的 ht[1] 哈希表分配空間所坯, 這個哈希表的空間大小取決于要執(zhí)行的操作, 以及 ht[0] 當(dāng)前包含的鍵值對數(shù)量 (也即是ht[0].used 屬性的值):
    • 如果執(zhí)行的是擴(kuò)展操作挂捅, 那么 ht[1] 的大小為第一個大于等于 ht[0].used * 2 的 2^n(2n 次方冪)芹助;
    • 如果執(zhí)行的是收縮操作, 那么 ht[1] 的大小為第一個大于等于 ht[0].used 的 [2^n]。
  2. 將保存在 ht[0] 中的所有鍵值對 rehash 到 ht[1] 上面: rehash 指的是重新計算鍵的哈希值和索引值状土, 然后將鍵值對放置到 ht[1] 哈希表的指定位置上无蜂。
  3. 當(dāng) ht[0] 包含的所有鍵值對都遷移到了 ht[1] 之后 (ht[0] 變?yōu)榭毡恚?釋放 ht[0] , 將 ht[1] 設(shè)置為 ht[0] 蒙谓, 并在 ht[1] 新創(chuàng)建一個空白哈希表斥季, 為下一次 rehash 做準(zhǔn)備。

<h1>哈希表的擴(kuò)展與收縮</h1>
當(dāng)以下條件中的任意一個被滿足時累驮, 程序會自動開始對哈希表執(zhí)行擴(kuò)展操作:

服務(wù)器目前沒有在執(zhí)行 BGSAVE 命令或者 BGREWRITEAOF 命令酣倾, 并且哈希表的負(fù)載因子大于等于 1 ;
服務(wù)器目前正在執(zhí)行 BGSAVE 命令或者 BGREWRITEAOF 命令谤专, 并且哈希表的負(fù)載因子大于等于 5 躁锡;

根據(jù) BGSAVE 命令或 BGREWRITEAOF 命令是否正在執(zhí)行, 服務(wù)器執(zhí)行擴(kuò)展操作所需的負(fù)載因子并不相同毒租, 這是因為在執(zhí)行 BGSAVE 命令或BGREWRITEAOF 命令的過程中稚铣, Redis 需要創(chuàng)建當(dāng)前服務(wù)器進(jìn)程的子進(jìn)程, 而大多數(shù)操作系統(tǒng)都采用寫時復(fù)制(copy-on-write)技術(shù)來優(yōu)化子進(jìn)程的使用效率墅垮, 所以在子進(jìn)程存在期間惕医, 服務(wù)器會提高執(zhí)行擴(kuò)展操作所需的負(fù)載因子, 從而盡可能地避免在子進(jìn)程存在期間進(jìn)行哈希表擴(kuò)展操作算色, 這可以避免不必要的內(nèi)存寫入操作抬伺, 最大限度地節(jié)約內(nèi)存。

另一方面灾梦, 當(dāng)哈希表的負(fù)載因子小于 0.1 時峡钓, 程序自動開始對哈希表執(zhí)行收縮操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末若河,一起剝皮案震驚了整個濱河市能岩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萧福,老刑警劉巖拉鹃,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲫忍,居然都是意外死亡膏燕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門悟民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝辫,“玉大人,你說我怎么就攤上這事射亏〗Γ” “怎么了竭业?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長银锻。 經(jīng)常有香客問我永品,道長,這世上最難降的妖魔是什么击纬? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮钾麸,結(jié)果婚禮上更振,老公的妹妹穿的比我還像新娘。我一直安慰自己饭尝,他們只是感情好肯腕,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钥平,像睡著了一般实撒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涉瘾,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天知态,我揣著相機(jī)與錄音,去河邊找鬼立叛。 笑死负敏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秘蛇。 我是一名探鬼主播其做,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赁还!你這毒婦竟也來了妖泄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤艘策,失蹤者是張志新(化名)和其女友劉穎蹈胡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柬焕,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡审残,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斑举。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搅轿。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖富玷,靈堂內(nèi)的尸體忽然破棺而出璧坟,到底是詐尸還是另有隱情既穆,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布雀鹃,位于F島的核電站幻工,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏黎茎。R本人自食惡果不足惜囊颅,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望傅瞻。 院中可真熱鬧踢代,春花似錦、人聲如沸嗅骄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溺森。三九已至慕爬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屏积,已是汗流浹背医窿。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留肾请,地道東北人留搔。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像铛铁,于是被迫代替她去往敵國和親隔显。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 字典本身就是很常見的數(shù)據(jù)結(jié)構(gòu)之一饵逐,在Redis中括眠,Redis數(shù)據(jù)庫就是使用字典來作為底層實現(xiàn)的,除了用來表示數(shù)據(jù)庫...
    wenmingxing閱讀 9,271評論 3 10
  • 字典 Redis 中的字典 由 dict.h/dict 結(jié)構(gòu)表示: type 和 privdata 是針對不同類型...
    jiangmo閱讀 535評論 2 0
  • 本文摘抄自redis閱讀筆記 典在Redis中應(yīng)用十分廣泛倍权,它是實現(xiàn)數(shù)據(jù)庫的基礎(chǔ)掷豺,特別的它是數(shù)據(jù)庫鍵空間的實現(xiàn)方式...
    lintong閱讀 599評論 0 3
  • 字典簡介 字典, 又稱符號表(symbol table)薄声、關(guān)聯(lián)數(shù)組(associative array)或者映射(...
    super_pirlo閱讀 661評論 0 51
  • 這片文章起念好久当船,卻遲遲因為懶惰沒有動筆,說的好聽點促使我坐下讓其成文的沖動就為來到默辨,而今晚它卻來敲了門德频。 之前和...
    楊四壺閱讀 435評論 1 2