image.png
- rehash分?jǐn)U容和縮容箫章,兩個(gè)過(guò)程互斥
- 交替使用h0和h1诊笤,來(lái)回搬遷美侦,類似jvm的s1和s2
- dict結(jié)構(gòu)中的rehashidx默認(rèn)-1产舞,表示沒(méi)有在擴(kuò)容,當(dāng)rehashidx>=0時(shí)菠剩,表示處于rehash中易猫,rehashIdx表示當(dāng)前擴(kuò)容的桶;
- 每次的增刪改查都會(huì)檢查當(dāng)前是否需要rehash具壮,如果達(dá)到臨界點(diǎn)則需要擴(kuò)容+遷移准颓;如果沒(méi)有達(dá)到臨界點(diǎn),但處于rehash中棺妓,則判斷幫忙遷移一次攘已;
- 一次遷移一個(gè)桶,rehashIdx++怜跑,redis后臺(tái)定時(shí)任務(wù)會(huì)在閑時(shí)幫忙一次遷移多個(gè)桶样勃;
- 新增時(shí)吠勘,幫忙后,會(huì)直插h1
- 整個(gè)rehash過(guò)程類似hashMap的rehash過(guò)程峡眶,只不過(guò)map的rehashMap是一次完成的剧防,redis采用漸進(jìn)式rehash,因?yàn)閞edis的命令是單步執(zhí)行辫樱,不會(huì)有并發(fā)沖突峭拘。hashMap需要防并發(fā);
- concurrentHashMap
- 并行rehash