精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis的Hashtable是如何擴容的

存儲 存儲軟件 Redis
Redis中使用哈希表作為底層實現的是叫做字典的數據結構,字典又稱為符號表、關聯數組或映射(map)。是一種保存鍵值對的抽象數據結構。

[[407448]]

騰訊面試官:說說Redis的哈希表是如何擴容的?

面試者:what?額......,(我懵了!)這個我還沒了解過,尬...。但我了解java里面的HashMap的擴容,我覺得應該有相通的一些原理在里面吧,然后我就把HashMap的擴容機制balabla的說了一遍......

Redis中使用哈希表作為底層實現的是叫做字典的數據結構,字典又稱為符號表、關聯數組或映射(map)。是一種保存鍵值對的抽象數據結構。

如果你對Java HashMap有所了解的話,那么Redis哈希表就是類似Java中HashMap。

由于Redis是用C語言寫的,所以要搞懂C的相關實現原理去看源碼的話就要對C語言有一定的了解。

目錄

1、哈希表結構

哈希表例子

2、字典數據結構

字典例子

3、解決哈希沖突

4、擴容/縮容——rehash

4.1、對字典的哈希表rehash步驟

4.2、看一次哈希表rehash擴容過程

5、漸進式rehash

5.1、漸進式rehash步驟

5.2、看下一次完整的漸進式rehash擴容的過程

6、總結

01哈希表結構

哈希表是由dictht結構體定義,table是一個數組,數組中每個元素是一個指向dictEntry結構的指針。

dictEntry是哈希表的節點,每個節點保存著一個鍵值對key、value,value可以是一個指針、或者是一個unit64_t或int64_t整數。

next屬性則是一個指向另一個哈希表節點的指針,形成一個鏈表,主要也是為了解決哈希沖突問題。

哈希表例子

一個空的哈希表

索引值相同的兩個節點使用鏈表連接起來

02字典數據結構

其實說到哈希表的話順便要了解下字典這種數據結構,畢竟它的底層就是哈希表來實現,可以了解下擴容縮容相關的。

type:指向dictType指針,保存了操作特定類型鍵值對的函數,Redis為不同用途的字典設置不同的類型特定函數。

privdata:保存了需要傳遞給不同特定函數的可選參數。

ht[2]:兩個哈希表,字典使用的哈希表是ht[0],ht[1]則是當對ht[0]哈希表進行rehash時使用。

trehashidx:記錄當前rehash進度,沒有進行rehash則為-1。

字典例子

普通狀態下的字典

03解決哈希沖突

將一個鍵值對添加到字典時,需要計算其哈希值和索引值,接著根據索引值將新節點放到哈希表數組的指定索引上。

計算哈希值:

  1. hash = dict->type->hashFunction(key

計算索引值:

  1. hash & dict->ht[x].sizemask 

鍵沖突:當兩個或以上數量的鍵進行哈希之后索引值一樣,也就是說兩個節點要放在同一個同桶里,這時可能就會存在覆蓋(沖突),那么就得解決這種沖突了。

Redis解決鍵沖突的方法:鏈地址法(separate chaining)——拉鏈法,假設你已了解Java HashMap原理,這里鏈地址法原理就不細說了。

插入一個題外話(也是筆者遇過的一道面試題):解決哈希沖突有什么方法?答案:①再哈希法;②鏈地址法;③開放地址法;④建立公共溢出區。(每種方法可以自行簡單了解下即可)

04擴容/縮容——rehash

首先,我們要清楚為什么要進行擴容或縮容?

擴容原因:當hashtable存儲的元素過多,可能由于碰撞也過多,導致其中某天鏈表很長,最后致使查找和插入時間復雜度很大。因此當元素超多一定的時候就需要擴容。

縮容原因:當元素數量比較少的時候就需要縮容以節約不必要的內存。

為了讓哈希表的負載因子(load factor)維持在一個合理的范圍內,會使用rehash(重新散列)操作對哈希表進行相應的擴展或收縮。

負載因子的計算公式:哈希表已保存節點數量 / 哈希表大小 load_factor = ht[0].used / ht[0].size

擴容的條件:(滿足任一即可)

1)Redis服務器目前沒有在執行BGSAVE或BGREWRITEAOF命令,并且哈希表的負載因子大于等于1。

2)Redis服務器目前在執行BGSAVE或BGREWRITEAOF命令,并且哈希表的負載因子大于等于5。

(此處為什么負載因子不同呢?)

縮容的條件:哈希表的負載因子小于0.1。

4.1、對字典的哈希表rehash步驟

1)為ht[1]分配空間

擴展操作,那么ht[1] 的大小為第一個大于等于ht[0] .used*2的2的n次冪

收縮操作,那么ht[1] 的大小為第一個大于等于ht[0].used 的2的n次冪

2)將ht[0]中的數據轉移到ht[1]中,在轉移的過程中,重新計算鍵的哈希值和索引值,然后將鍵值對放置到ht[1]的指定位置。

3)當ht[0]的所有鍵值對都遷移到了ht[1]之后(ht[0]變為空表),將ht[0]釋放,然后將ht[1]設置成ht[0],最后為ht[1]分配一個空白哈希表:

4.2、看一次哈希表rehash擴容過程

1)開始rehash之前

2)為ht[1]分配空間,ht[0].used當前值為4,8恰好是第一個大于等于4的2的N次冪,那么當前就會將ht[1]哈希表大小設置為8。

3)將ht[0]的鍵值對都rehash到ht[1]

ht[0]鍵值對都已遷移到ht[1]

4)釋放ht[0],將ht[1]設置為ht[0],ht[1]再設置為空的哈希表

rehash擴容完成

為什么BGSAVE或BGREWRITEAOF命令是否在執行,Redis服務器哈希表執行擴容所需的負載因子不相同(1或5)?

因為當執行BGSAVE或BGREWRITEAOF命令過程中,Redis需要創建服務器進程的子進程,操作系統采用的是COW,即寫時復制copy-on-write的技術來優化子進程的使用效率。所以在子進程存在時,服務器會提高執行擴容所需的負載因子,從而盡可能避免在子進程存在期間進行擴容,可以避免不必要的內存寫入操作,最大限度節約內存。

05漸進式rehash

為什么需要漸進式rehash呢?

在元素數量較少時,rehash會非常快的進行,但是當元素數量達到幾百、甚至幾個億時進行rehash將會是一個非常耗時的操作。如果一次性將成萬上億的元素的鍵值對rehash到ht[1],龐大的計算量可能會導致服務器在一段時間內停止服務,這是非常危險的!所以,rehash這個動作不能一次性、集中式的完成,而是分多次、漸進式地完成。

5.1、漸進式rehash步驟:

1)為ht[1]分配空間,讓字典同時持有ht[0]和ht[1]兩個哈希表。

2)在字典中維持一個索引計數器變量rehashidx,并將它的值設置為0,表示rehash工作正式開始。

3)在rehash進行期間,每次對字典執行CRUD:添加、刪除、查找或者更新操作時,程序除了執行指定的操作以外,還會順帶將ht[0]哈希表在rehashidx索引上的所有鍵值對rehash到ht[1],當rehash工作完成之后,程序將rehashidx+1(表示下次將rehash下一個桶)。

4)隨著字典操作的不斷執行,最終在某個時間點上,ht[0]的所有鍵值對都會被rehash至ht[1],這時程序將rehashidx屬性的值設為-1,表示rehash完成。

漸進式rehash的好處在于它采取分而治之的方式,將rehash鍵值對所需的計算工作均攤到對字典的每個添加、刪除、查找和更新操作上,從而避免了集中式rehash 而帶來的龐大計算量。

5.2、看下一次完整的漸進式rehash擴容的過程

1)準備進行漸進式rehash

準備rehash

2)此時rehashidx=0,也就是會將索引為0的鍵值對進行遷移

rehash索引0上的鍵值對

3)接著,rehashidx繼續遞增,假如到最后將索引3的進行遷移,如下:

最后一次rehash,索引為3上的鍵值對進行遷移

4)漸進式rehash結束

rehash結束

了解了漸進式rehash的原理和過程,那么可能會有下面這些疑問:

在遷移的過程中,會不會造成讀少數據?

不會,因為在遷移時,首先會從ht[0]讀取數據,如果ht[0]讀不到,則會去ht[1]讀。

在遷移過程中,新增加的數據會存放在哪個ht?

遷移過程中,新增的數據只會存在ht[1]中,而不會存放到ht[0],ht[0]只會減少不會新增。

06總結

1)字典被Redis廣泛應用于各種功能,比如數據庫和哈希鍵。

2)Redis字典底層是有哈希表實現,每個字典包含兩個哈希表ht[0]、ht[1],ht[1]在rehash時才有作用。

3)哈希表使用鏈地址法解決哈希沖突,被分配到同一個索引的鍵值對會連接成一個單向鏈表。

4)哈希表進行rehash不是一次性完成,而是分多次、漸進式完成的。

5)哈希表rehash的條件:

擴容:(滿足任一即可)

a)Redis服務器目前沒有在執行BGSAVE或BGREWRITEAOF命令,并且哈希表的負載因子大于等于1。

b)Redis服務器目前在執行BGSAVE或BGREWRITEAOF命令,并且哈希表的負載因子大于等于5。

縮容:哈希表的負載因子小于0.1。

6)BGSAVE或BGREWRITEAOF命令是否在執行,Redis服務器哈希表執行擴容所需的負載因子不相同。因為此時子進程使用寫時復制copy on write,需要占用一定的內存,所以需要提高擴容所需的負載因子,從而盡可能避免在子進程存在期間進行擴容,可以避免不必要的內存寫入操作,最大限度節約內存。

了解了Redis字典哈希表擴容,那么你知道與Java ConcurrentHashMap(1.8)的擴容有什么不同嗎?

也就是引出這個問題:

Redis的字典漸進式擴容與ConcurrentHashMap的擴容策略比較?那么他們在擴容、CRUD時有什么區別呢?

1)擴容所花費的時間對比

一個單線程漸進擴容,一個多線程協同擴容。在平均的情況下,是ConcurrentHashMap快。這也意味著,擴容時所需要

花費的空間能夠更快的進行釋放。

2)讀操作,兩者的性能相差不多。

3)寫操作,Redis的字典返回更快些,因為它不像ConcurrentHashMap那樣去幫著擴容(當要寫的桶位已經搬到了newTable時),等擴容完才能進行操作,而redis則是直接將新加的元素添加到ht[1]。

4)刪除操作,與寫一樣。

最后,我們應該選擇單線程漸進式擴容還是選擇多線程協同式擴容?具體問題具體分析:

1)如果內存資源吃緊,希望能夠進行快速的擴容方便釋放擴容時需要的輔助空間,且那么選擇后者。

2)如果對于寫和刪除操作要求迅速,那么可以選擇前者。

參考資料:

#1《redis設計與實現》

#2 https://blog.csdn.net/jiji1995/article/details/64127460

#3 https://blog.csdn.net/u010710458/article/details/80604740

#4 源碼分析:https://www.jianshu.com/p/a57a6e389a03

責任編輯:武曉燕 來源: 搬運工來架構
相關推薦

2023-04-03 08:02:16

切片擴容GO

2025-04-24 08:15:00

Redis單線程線程

2024-04-24 07:00:00

Redis架構數據持久化

2018-12-19 17:20:17

2025-09-09 01:45:00

2018-05-03 08:53:41

Redis存儲對象

2021-03-29 15:59:52

區塊鏈比特幣擴容

2022-07-05 14:49:25

Redis 6多線程

2022-01-21 14:26:05

區塊鏈鏈上鏈下

2025-02-13 11:11:53

Redis哨兵代碼

2021-11-19 11:36:42

語言string字符串

2020-10-23 06:56:00

C語言動態字符串

2024-08-29 12:37:11

2024-12-25 10:24:31

2011-02-16 09:48:04

Hashtable

2011-02-28 09:31:30

HashtableHashMap

2018-06-21 09:30:50

比特幣區塊鏈擴容

2024-06-12 13:36:24

2022-01-02 08:38:22

Redis數據單線程

2020-01-10 15:15:53

Redis點贊數據庫
點贊
收藏

51CTO技術棧公眾號

久久久久久久久久网| 国产成人精品免费视频大全最热| 亚洲天堂最新地址| 电影中文字幕一区二区| 亚洲大型综合色站| 欧美一区二区综合| 国产jzjzjz丝袜老师水多| 国产精品久久久免费| 色偷偷9999www| 小毛片在线观看| 韩日一区二区| 午夜久久久影院| 日本亚洲导航| 日本精品久久久久| 久草精品在线观看| 欧美与黑人午夜性猛交久久久| 一本色道久久88| 日韩中文av| 日韩欧美一级精品久久| 在线视频日韩一区| 免费h在线看| 一区二区在线看| 亚洲精品日韩成人| 亚洲欧美色视频| 国产精品一区二区果冻传媒| 国产精品对白刺激| 日本一级一片免费视频| 亚洲成人一区| 日韩有码在线播放| 受虐m奴xxx在线观看| av动漫精品一区二区| 欧美精品18+| 激情五月婷婷久久| 亚洲精品永久免费视频| 亚洲综合免费观看高清完整版在线 | 麻豆久久一区| 欧美日韩国产综合久久| 国产视频一区二区三区在线播放| 国产美女高潮在线| 亚洲亚洲人成综合网络| 国产精品啪啪啪视频| 欧美激情办公室videoshd| 国产日产欧美一区二区三区| 欧美精品尤物在线| 青青草手机在线| 91丨porny丨首页| 精品日韩美女| 天堂成人在线| 久久精品无码一区二区三区| 就去色蜜桃综合| 亚洲欧洲综合在线| 91蝌蚪porny成人天涯| 国产一区免费视频| 人妻少妇精品无码专区| 成人午夜伦理影院| 国产麻豆乱码精品一区二区三区| 亚洲毛片欧洲毛片国产一品色| 国产高清一区日本| 99国产高清| 好吊视频一二三区| 99久久精品免费精品国产| 韩国精品一区二区三区六区色诱| 丰满肉肉bbwwbbww| 99国产精品久| 欧美一区二区视频在线| 成人高清免费观看mv| 国产精品久久久久7777按摩| 一本色道久久99精品综合| 麻豆免费在线视频| 亚洲一线二线三线久久久| 国产精品入口芒果| 鲁鲁在线中文| 色菇凉天天综合网| 中文字幕第17页| 精品国产第一国产综合精品| 精品国产乱码久久久久久影片| 日本道中文字幕| 国产精品亚洲二区| 超碰97人人做人人爱少妇| 国产一级做a爱免费视频| 99日韩精品| 国产欧美一区二区三区在线看 | 一区二区在线观看网站| av在线网址观看| 亚洲成人综合视频| 91视频免费版污| 日韩高清在线观看一区二区| 日韩高清不卡av| 男人天堂资源网| 欧美色123| 国产va免费精品高清在线观看| 91尤物国产福利在线观看| 国产99久久久国产精品潘金 | av片在线观看| 欧美视频专区一二在线观看| 青青草原国产在线视频| 精品亚洲免a| 深夜福利91大全| 可以免费在线观看的av| 寂寞少妇一区二区三区| 久热这里只精品99re8久| 成人高清免费在线| 91久久精品国产91性色tv| 在线观看视频你懂得| 精品国产一区二区三区小蝌蚪 | 精品国产一区久久久| 亚州国产精品视频| 国产麻豆一精品一av一免费| 欧美专区一二三| 男人天堂亚洲| 欧美一区二区三区四区五区| www色com| 国产精品久久久久久久久久妞妞| 成人午夜激情网| 懂色av中文在线| 欧美日韩中文在线观看| 免费看91视频| 亚洲色图插插| 国产精品99久久久久久久久| 天堂av资源在线| 一区二区在线观看免费视频播放| 黄色av免费在线播放| 日韩av影院| 久久免费精品视频| 999国产精品视频免费| 国产精品家庭影院| 亚洲天堂av线| 免费av一区二区三区四区| 午夜伦理精品一区 | 国产一区av在线| 国产成人免费观看视频| 粉嫩av一区二区三区在线播放| 五月天av影院| 日本国产亚洲| 中文字幕少妇一区二区三区| 无码人妻一区二区三区线| 99国产欧美另类久久久精品| 亚洲 自拍 另类小说综合图区| 试看120秒一区二区三区| 久久精品一区中文字幕| 国产精品久久久久久久免费看| 国产精品色呦呦| 亚洲免费999| 婷婷六月综合| 91中文字幕在线| 三级资源在线| 精品国产髙清在线看国产毛片| 国产探花在线免费观看| 国产成人免费视频网站| 亚洲熟妇无码av在线播放| 在线视频亚洲欧美中文| 国内精品久久久久影院优| 姝姝窝人体www聚色窝| 红桃av永久久久| 成年人网站免费看| 玖玖玖国产精品| 深夜福利成人| 亚洲精品aaa| 欧美激情精品久久久| 免费观看毛片网站| 精品国产精品自拍| 无码人妻精品一区二区中文| 日产欧产美韩系列久久99| 黄频视频在线观看| 视频一区国产| 欧美一级片久久久久久久| 国产区视频在线| 欧美男生操女生| av资源吧首页| 久久久精品免费观看| 无需播放器的av| 中文字幕av亚洲精品一部二部| 高清国产一区| 男人皇宫亚洲男人2020| 中文字幕不卡在线视频极品| 国产露脸无套对白在线播放| 亚洲一级不卡视频| 无码人妻丰满熟妇啪啪欧美| 国产美女娇喘av呻吟久久| 日本日本19xxxⅹhd乱影响| 欧美日韩在线二区| 91原创国产| 小早川怜子影音先锋在线观看| 在线精品高清中文字幕| 亚洲国产精品成人久久蜜臀| 欧美性猛交丰臀xxxxx网站| 青青青视频在线免费观看| 成人在线综合网| 噼里啪啦国语在线观看免费版高清版| 亚洲成人国产| 蜜桃视频日韩| 久久伦理中文字幕| 日韩av片永久免费网站| 综合久久2019| 国产一区二区三区视频免费| 亚洲精品国偷拍自产在线观看蜜桃| 日韩欧美亚洲范冰冰与中字| 一区二区视频免费看| 久久久精品国产免费观看同学| 色偷偷中文字幕| 久久三级福利| 久久人人爽人人爽人人av| 日韩电影免费网址| 久久精品女人的天堂av| 亚洲码欧美码一区二区三区| 国产精品久久久久999| 国产h片在线观看| 久久久国产精品免费| 九色在线视频蝌蚪| 亚洲第一色中文字幕| 精品乱码一区内射人妻无码| 午夜精品一区二区三区三上悠亚| 国产又粗又长又黄的视频| 久久婷婷色综合| 久草免费资源站| 国产麻豆精品在线观看| 网站一区二区三区| 久久黄色影院| 欧美日本视频在线观看| 激情久久婷婷| 日本女人高潮视频| 色135综合网| 日韩精品一线二线三线| 日韩精品免费一区二区夜夜嗨| 亚洲最大成人在线| 国产高清日韩| 91精品美女在线| 成人在线免费电影网站| 国产xxx69麻豆国语对白| 日本а中文在线天堂| 国内伊人久久久久久网站视频 | 欧美性xxxxx极品娇小| 精品一区二区三区四| 亚洲精品中文字幕乱码三区 | 国产视频福利在线| 亚洲女人天堂av| 神马久久精品| 亚洲欧美日韩国产中文| 污污视频在线免费看| 亚洲国产精品久久久久秋霞蜜臀| 亚洲精品无码久久久| 日韩一区二区电影在线| jlzzjlzzjlzz亚洲人| 91精品国产综合久久蜜臀| 91麻豆视频在线观看| 欧美精品丝袜久久久中文字幕| 在线观看中文字幕网站| 欧美日韩视频在线一区二区 | 精品国产乱码久久久久久1区2区 | 91theporn国产在线观看| 欧美日韩久久久久久| 亚洲综合一区中| 精品污污网站免费看| 国产又粗又猛视频| 日韩一区二区三区在线| 国产黄色美女视频| 亚洲精品福利在线观看| 日本国产在线| 最近中文字幕mv在线一区二区三区四区| eeuss影院www在线播放| 日韩一区av在线| 性欧美videos高清hd4k| 97国产精品久久| 亚洲综合在线电影| 91久久久久久久久久久| 中文无码日韩欧| 欧美一区少妇| 99精品电影| 久久久久久www| 奇米影视7777精品一区二区| 91精品999| 成人精品一区二区三区四区| 精品夜夜澡人妻无码av| 欧美国产丝袜视频| 精品欧美一区二区久久久久| 亚洲r级在线视频| 五月天中文字幕| 精品欧美久久久| 黄色片在线免费看| 麻豆一区二区在线观看| 国产直播在线| 成人xvideos免费视频| 国内毛片久久| 亚洲精品国产精品国自产观看| 黄色欧美日韩| 亚洲这里只有精品| av中文字幕一区| 国产午夜精品理论片在线| 精品国产户外野外| 国产精品久久久久久69| 亚洲男人av在线| 亚洲欧美成人影院| 国产成人精品综合久久久| 无码国模国产在线观看| 日韩精品第一页| 亚洲精品女人| 日韩av影视大全| 久久久精品黄色| 91精品国产高潮对白| 欧美日韩视频不卡| 日韩精品系列| 欧美疯狂性受xxxxx另类| www.久久.com| 久久另类ts人妖一区二区| 欧美日本国产| 波多野结衣xxxx| 国产午夜一区二区三区| 国产亚洲成人av| 欧美一区二区三区视频免费 | 欧美交受高潮1| 自拍偷拍亚洲| 特级西西444www大精品视频| 亚洲人妖在线| 国产又黄又嫩又滑又白| 国产精品久久久久久久久动漫| 国产伦精品一区二区三区视频我| 精品国产网站在线观看| 蜜桃视频在线观看www社区| 日韩av三级在线观看| 性欧美lx╳lx╳| 成人在线国产视频| 国产二区国产一区在线观看| 美女视频久久久| 亚洲自拍偷拍在线| 精品国产导航| 亚洲高潮无码久久| 久久电影网站中文字幕| 亚洲AV无码成人精品区明星换面| 疯狂欧美牲乱大交777| 免费观看的毛片| 国模gogo一区二区大胆私拍 | 欧美日韩精品是欧美日韩精品| 可以直接在线观看的av| 欧美做受高潮1| 亚洲区小说区| 人妻精品无码一区二区三区| 91亚洲国产成人精品一区二三| 久草中文在线视频| 日韩视频在线你懂得| 在线免费观看a视频| 亚洲自拍偷拍区| 黄色精品一区| 性久久久久久久久久久| 精品福利樱桃av导航| 天堂成人在线观看| 97视频在线观看播放| 日韩动漫一区| 无码日韩人妻精品久久蜜桃| 欧美极品aⅴ影院| 国产又粗又大又爽| 久青草国产97香蕉在线视频| 亚洲2区在线| 国产一区二区四区| 91在线精品秘密一区二区| 69国产精品视频免费观看| 伊人久久久久久久久久| 未满十八勿进黄网站一区不卡| 宅男av一区二区三区| 国产精品一区二区黑丝| 国产真人真事毛片| 日韩精品在线免费播放| 福利精品一区| 国产日韩第一页| 成人高清视频免费观看| 欧美一区免费看| 精品国产依人香蕉在线精品| 91成人精品在线| 黄色片一级视频| 亚洲欧洲成人精品av97| 黄色一级大片在线免费看国产| 午夜精品久久久久久久久久久久久 | 黄网在线观看视频| 国产一区二区日韩精品欧美精品| 国产精品成人国产| 欧美无砖专区免费| 国产午夜久久久久| xxxx国产精品| 国产不卡av在线| 欧美1区3d| 成年人网站免费在线观看 | 欧美成人乱码一二三四区免费| 亚洲精品欧美激情| 天堂av电影在线观看| 成人网页在线免费观看| 国产亚洲精品v| 成人性生活毛片| 亚洲欧美国内爽妇网| 国产麻豆一区二区三区| 免费在线激情视频| 亚洲美女免费视频| 国产在线超碰| y111111国产精品久久婷婷| 日韩综合在线视频| 国产黄色片视频| 久久成人免费视频| 亚洲婷婷影院| 午夜影院福利社| 欧美日韩在线三区| 在线看片福利| 99久久免费观看|