欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Redis字典實現、Hash鍵沖突及漸進式rehash詳解

Redis字典實現、Hash鍵沖突及漸進式rehash詳解

熱門標簽:宿遷便宜外呼系統平臺 魔獸2青云地圖標注 山東外呼銷售系統招商 十堰營銷電銷機器人哪家便宜 日本中國地圖標注 北京400電話辦理收費標準 貴州電銷卡外呼系統 鄭州人工智能電銷機器人系統 超呼電話機器人

本筆記參考《Redis設計與實現》 P24~ 37

Redis字典實現

哈希表節點結構

typedef struct dictEntry
{
	// 鍵
	void *key;

	// 值 : 可以是一個指針,或者是一個uint64/int64 的整數
	union {
		void *val;
		uint64_t u64;
		int64_t s64
	} v;

	// 指向下一個哈希表節點,形成鏈表 : 該指針可以將多個哈希值相同的鍵值對連接在一起,以此解決鍵沖突的問題。
	struct dictEntry *next;
} dictEntry;

哈希表結構

typedef struct dictht
{
	// 哈希表數據
	dictEntry **table;

	// 哈希表集合大小
	unsigned long size;

	// 哈希表大小掩碼,用于計算索引值
	// 總是等于 size - 1
	unsigned long sizemask;

	// 哈希表已有節點數量
	unsigned long used;
} dictht;

字典

typedef struct dict 
{
	// 類型特定函數
	dicType *type;

	// 私有數據
	void *privdata;

	// 哈希表
	dictht ht[2];

	// rehash 索引
	// 當rehash不在進行時, 值為-1
	int rehashidx;
} dict;

type屬性和privdata屬性針對不同類型的鍵值對,為多態字典而設置。
ht是包含兩個項的數組,每個元素都是一個dictht哈希表,一般情況下字典之是喲個ht[0],ht[1]會在對ht[0]進行rehash的時候使用。
rehashidx記錄了rehash目前的進度,如果目前沒有在進行rehash,值為-1。

哈希算法

  • 使用字典設置的哈希函數,計算key的hashvalue

hash = dict->type->hashFunction(key);

  • 使用哈希表的sizemask屬性和哈希值,計算出索引值
  • 根據不同的情況,ht[x]可以是ht[0]或ht[1]

index = hash dict->ht[x].sizemask;

redis使用的是MurmurHash算法,優點是:輸入的鍵是有規律的時候,算法仍然能給出很好的隨機分布性,計算速度也快。

解決hash沖突

當有兩個或以上的key分配到了hash table數組的同一個index上,稱為發生了collision。
Redis采用鏈地址法解決沖突,每個hash table節點都有一個next指針,多個hash table節點可以用next指針構成一個單向鏈表。為了速度考慮,程序總是會將新節點插入到鏈表頭位置。

rehash

隨著操作不斷執行,哈希表保存的key value對會逐漸增加和減少。哈希表有一個統計參數load factor,即負載因子,公式如下:

# 負載因子 = 哈希表已經保存的節點數量 / 哈希表大小
load_factor = ht[0].used / ht[0].size;

為了維持負載因子在一個合理的范圍,程序會對哈希表的大小進行相應的擴展或收縮,條件如下:

1、服務器目前沒有執行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的負載因子 >= 1

2、服務器正在執行BGSAVE命令或者BGREWRITEAOF命令,且負載因子 >= 5

  • 在執行BGSAVE命令或者BGREWRITEAOF命令過程中,Redis需要創建當前服務器進程的子進程,大多的OS采用寫時復制技術優化子進程的使用效率,所以子進程存在期間,**服務器會提高執行擴展操作的負載因子,避免在子進程存在期間進行哈希表的擴展操作,避免不必要的內存寫入操作,最大限度節約內存。**當負載因子小于0.1時,程序自動對哈希表進行收縮操作。
  • 此時就會進行擴展收縮,規則如下:
  • 這里就是rehash(重新散列)操作了:
  • 1、為字典的ht[1]哈希表分配內存空間,空間大小取決于要執行的操作,以及ht[0]當前包含的鍵值對數量(ht[0].used)
  • 如果是擴展操作,ht[1]的大小為 >= ht[0].used * 2的 2的冪次方
  • 如果是收縮操作,ht[1]的大小為 >= ht[0].used 的 2的冪次方
  • 2、將保存在ht[0]中的所有鍵值對rehash到ht[1]上:即重新計算key的hashValue以及indexValue,然后將鍵值對放到ht[1]的指定位置
  • 3、當ht[0]包含的所有鍵值對都遷移到ht[1]之后,ht[0]變為空表,釋放ht[0],將ht[1]置為ht[0],在ht[1]重新分配一個空白的哈希表,為下一次rehash做準備

漸進式hash

rehash的動作并不是一次性集中完成的,而是分多次漸進完成。
如果哈希表中村的鍵值對數量很多,一次性將鍵值對全部rehash到ht[1]的計算量十分龐大,可能會導致服務器在一段時間內停止服務。
漸進式rehash采取分而治之的方法,將rehash鍵值對所需要的計算工作分攤到每次對字典的CRUD操作上,從而避免了集中式rehash帶來的龐大計算量。
詳細步驟如下:
1、為ht[1]分配空間,讓字典同時持有ht[0]和ht[1]兩個哈希表
2、在字典中維護一個索引計數器:rehashidx,將值設置為0,表示rehash工作正式開始。
3、在rehash進行期間,每次對字典的CRUD操作,程序除了執行指定操作以外,順帶將ht[0]哈希表在rehashidx索引上的所有鍵值對rehash到ht[1]上,當rehash操作完成后,程序將rehashidx值++
4、重復迭代操作執行后,ht[0]的數據全部rehash到ht[1]上,將rehashidx設為-1,表明rehash操作已經完成

需要注意的地方
在rehash的過程中,對于字典的刪除、查找、更新操作會在兩個哈希表上執行。如想要查找一個鍵,現在ht[0]中找,沒有找到再去ht[1]
對于insert操作來說,新添加到字典的鍵值對會一律保存到ht[1]中,不然還得多一次搬運。

到此這篇關于Redis字典實現、Hash鍵沖突以及漸進式rehash的文章就介紹到這了,更多相關Redis 漸進式rehash內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • redis中hash表內容刪除的方法代碼
  • Python操作redis實例小結【String、Hash、List、Set等】
  • Redis String 類型和 Hash 類型學習筆記與總結
  • Redis教程(四):Hashes數據類型
  • SpringBoot+Redis實現數據字典的方法
  • python redis存入字典序列化存儲教程
  • redis中Hash字典操作的方法

標簽:北京 吉安 臺州 朝陽 江蘇 楊凌 果洛 大慶

巨人網絡通訊聲明:本文標題《Redis字典實現、Hash鍵沖突及漸進式rehash詳解》,本文關鍵詞  Redis,字典,實現,Hash,鍵,沖突,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis字典實現、Hash鍵沖突及漸進式rehash詳解》相關的同類信息!
  • 本頁收集關于Redis字典實現、Hash鍵沖突及漸進式rehash詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    9久草视频在线视频精品| 永久看看免费大片| 欧美日韩一区二区区| 18禁裸乳无遮挡啪啪无码免费| 国产视频精品免费| 欧美日本高清视频在线观看| 久久精品亚洲麻豆av一区二区| 亚洲一区二区影院| 国产精品12区| 亚洲av无码国产精品久久| 国产精品九九九九九九| 精品成人免费观看| 亚洲国产另类av| 成人一区二区三区视频在线观看| 性欧美成人播放77777| 91久久精品网| 久久久91精品国产一区二区精品| 香蕉成人啪国产精品视频综合网| 成人黄色av电影| 色无极影院亚洲| 欧美日韩精品一区视频| 中文字幕久久午夜不卡| 裸体歌舞表演一区二区| 四虎精品一区二区| 在线精品亚洲一区二区不卡| 国产日韩精品一区二区浪潮av| 亚欧色一区w666天堂| 成人av高清在线| 亚洲av熟女国产一区二区性色| 91精品在线免费观看| 亚洲美女屁股眼交3| 国产v综合v亚洲欧| 手机毛片在线观看| 日韩区在线观看| 性做久久久久久久久| 亚洲国产日韩在线一区| 疯狂撞击丝袜人妻| 国产亚洲精久久久久久| 久久99精品一区二区三区| 制服丝袜第二页| 在线播放日韩导航| 亚洲一区二区三区在线看| 99精品欧美一区| 国产精品成人免费观看| 日本一区二区免费在线观看视频| 另类小说欧美激情| 欧美亚一区二区三区| 91精品免费在线| 亚洲大片一区二区三区| 日本女人性视频| 欧美性受xxxx黑人xyx| 亚洲精品中文字幕乱码三区| 99久久精品免费看国产免费软件| 国产尤物在线播放| 国产精品成人一区二区三区夜夜夜| 国产成人综合在线播放| 蜜桃视频最新网址| 国产精品色一区二区三区| 国产精品911| 看免费黄色录像| 中文字幕在线观看一区| 成人国产在线观看| 中文字幕av免费在线观看| 成人免费在线播放视频| 99久久伊人网影院| 欧美性一二三区| 午夜精品久久久久久久久久| 国产精品成人无码专区| 日韩视频在线一区二区| 久久精品72免费观看| 卡一卡二卡三在线观看| 国产欧美在线观看一区| 高清不卡一二三区| 色婷婷av一区二区| 亚洲综合视频网| 亚洲最大的黄色网| 久久久久久久久岛国免费| 国产成人av一区二区三区在线| 国产精品视频一区二区三| 亚洲女子a中天字幕| 乳色吐息在线观看| 欧美一区二区在线不卡| 美腿丝袜一区二区三区| 欧美成人久久久免费播放| 国产精品久久免费看| 韩国三级丰满少妇高潮| 制服丝袜亚洲色图| 极品尤物av久久免费看| 欧美手机在线观看| 亚洲国产成人va在线观看天堂| 少妇精品一区二区| 国产日韩欧美高清在线| 99久久婷婷国产综合精品| 欧美精品在线一区二区三区| 久久se这里有精品| 免费在线观看一级片| 五月综合激情网| 日本免费www| 一区二区三区波多野结衣在线观看| 国产精品手机在线观看| 国产亚洲精久久久久久| 制服下的诱惑暮生| 久久综合色8888| 99久久婷婷国产精品综合| 日韩亚洲欧美一区二区三区| 国产麻豆精品视频| 欧美色窝79yyyycom| 毛片av一区二区| 国产盗摄x88av| 日韩和欧美的一区| 黑鬼狂亚洲人videos| 五月天激情小说综合| 我要看一级黄色录像| 午夜精品福利久久久| 又色又爽的视频| 亚洲a一区二区| 午夜精品一区二区三区视频| 天堂成人国产精品一区| 免费在线黄色网| 免费精品视频在线| 色综合中文字幕国产| 午夜亚洲福利老司机| 国产色无码精品视频国产| 午夜伦欧美伦电影理论片| 一区二区三区四区五区| 丝袜亚洲另类欧美综合| 老妇女50岁三级| 激情综合网av| 欧美久久久一区| 波多野结衣精品在线| 精品国产成人在线影院 | 欧美xxxxx精品| 中文字幕久久午夜不卡| 在线 丝袜 欧美 日韩 制服| 亚洲三级电影网站| 欧美精品日韩在线| 天天av天天翘天天综合网色鬼国产 | 免费黄色a级片| 国产精品麻豆视频| 日本少妇xxxxx| 天天影视色香欲综合网老头| 一本久久精品一区二区| 国产精品资源网站| 日韩一二三区不卡| 国产综合内射日韩久| 亚洲色图色小说| 日日碰狠狠添天天爽| 欧美96一区二区免费视频| 欧美日韩高清影院| 91在线视频在线| 国产精品欧美久久久久无广告| 无码国产69精品久久久久同性| 亚洲超碰精品一区二区| 色欧美日韩亚洲| 高清beeg欧美| 国产亚洲视频系列| 亚洲精品国产精品国自| 蜜桃视频一区二区| 日韩一区二区在线看| 一级少妇精品久久久久久久| 一区二区成人在线视频| 色婷婷av久久久久久久| 成人午夜电影久久影院| 国产女人aaa级久久久级| 永久免费毛片在线观看| 男女激情视频一区| 日韩精品一区二区三区swag| 日本黄色免费观看| 午夜精品免费在线| 91精品国产色综合久久不卡电影| 美女流白浆视频| 一级做a爱片久久| 在线精品观看国产| 91麻豆免费看片| 一区二区三国产精华液| 欧美三级电影在线看| 中文字幕一二三| 亚洲国产精品久久人人爱| 欧美日韩第一区日日骚| 天堂www中文在线资源| 午夜欧美电影在线观看| 在线不卡免费av| 欧美 变态 另类 人妖| 美女一区二区久久| 久久综合狠狠综合久久激情| 国产精品国产三级国产专业不| 国产精品综合久久| 国产精品夫妻自拍| 在线亚洲免费视频| 亚洲色图欧美日韩| 日韩中文字幕麻豆| 精品乱人伦一区二区三区| 国产午夜福利一区| 成人激情综合网站| 亚洲一区二区综合| 欧美电影精品一区二区| 91视频免费看片| 成人18视频日本| 亚洲一区在线看| 日韩一区二区三区av|