国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

阿里面試官:談談對Redis哈希表的理解

存儲 存儲軟件 Redis
哈希表是一種存儲數據的結構,他有很多名字(鍵值對、字典、符號表、映射、關聯數組)。在哈希表中,鍵和值是一一對應的關系,一個鍵key對應一個值value。哈希表這個數據結構可以通過鍵key,在O(1)時間復雜度的情況下獲得對應的值。

[[433454]]

Hash表回顧

哈希表是一種存儲數據的結構,他有很多名字(鍵值對、字典、符號表、映射、關聯數組)。在哈希表中,鍵和值是一一對應的關系,一個鍵key對應一個值value。哈希表這個數據結構可以通過鍵key,在O(1)時間復雜度的情況下獲得對應的值。

由于C語言自己沒有內置哈希表這一數據結構,因此Redis自己實現了Hash表。

哈希沖突及處理辦法

哈希表最關鍵的問題就在于哈希沖突。即,兩個項,經過哈希函數計算,發現其對應的存儲方式位置一致。對于這種情況,就需要進行進一步處理了。

解決哈希沖突的辦法

大家應該背過我寫的數據結構與算法八股文背誦版,還記得解決Hash沖突的方法嘛。

線性探查法(開放地址)。

這個方法的核心是:一旦碰見有沖突,該項往后順延.

來看個例子吧。

1.按hash算法,新鍵值對應該存在箭頭所處位置,可惜該位置有值了:

開放地址法

2.因此需要存儲順延的位置:

開放地址法

3.順延位置也有值了,再往后順延

開放地址法

4.順延位置還是有值,再往后順延,終于存儲上了

開放地址法

鏈地址法(拉鏈法)

Redis采用的方法就是這種拉鏈法。來看下面例子。新鍵值對計算應該存到二號,二號此時已經有一個鍵值對了。因此,直接通過鏈表的方式掛到二號鍵值對1的下面。

拉鏈法

對于新的鍵值對也是如此,通過鏈表的方式掛到二號鍵值對2的下面。

Rehash

在講rehash之前,首先需要引入一個定義:負載因子。來看一下負載因子的定義吧:

負載因子 = 散列表內元素個數/散列表的長度

如果負載因子高,就說明哈希沖突概率大,這樣會嚴重拖慢查找效率。

如果負載因子低,就說明這哈希表好像占用空間太多了,大部分空間都沒元素。

為了使負載因子值在合理范圍內,程序需要對哈希表進行擴展或收縮。由于空間變大或縮小,之前的鍵在老表的存儲位置,在新表中就不一定一樣了,需要重新計算。這個重新計算,并把老表元素轉移到新表元素的過程就叫做rehash。當然無論是java中的hashmap,concurrenthashmap,還是今天要講的Redis哈希表,都涉及rehash過程。

Redis中哈希表的數據結構

來看一下Redis的Hash表邏輯設計結構 Redis的哈希表主要由三個結構構成:

dictht。單純表示一個哈希表

dictEntry。哈希表的一項,可以看作就是一個鍵值對

dict。Redis給外層調用的哈希表結構,包含兩個dictht

  1. typedef struct dictht {  
  2.     dictEntry **table; //哈希表數組(哈希表項集合) 
  3.     unsigned long size; //Hash表大小  
  4.     unsigned long sizemask; //哈希表掩碼 
  5.     unsigned long used;//Hash表已使用的大小 
  6. } dictht; 

稍微解釋一下各個項。

  • table:哈希表項的指針數組
  • size:哈希表大小,這應該不用多解釋吧
  • sizemask:掩碼。這個值其實設計思想很棒,假設Redis長度是3,你想訪問第5個元素,如果按之前的方法,那肯定是訪問到超出redis哈希表范圍的地址空間了。所以redis規定,你想訪問元素,先把index與size做與,把超過redis長度的部分就截斷了,就不會發生內存安全問題。
  • Hash表已使用的大小。不解釋。

講了Hash表,來看看哈希項

  1. typedef struct dictEntry {  
  2.     void *key;  
  3.     union {  
  4.         void *val;  
  5.         uint64_t u64;  
  6.         int64_t s64;  
  7.         double d;  
  8.     } v;  
  9.     struct dictEntry *next
  10. } dictEntry; 

我們知道,Redis采用拉鏈法解決哈希沖突的問題。因此,Redis的哈希表項就有一個next指針,指向下一個元素,通過該指針,就可以訪問多個具有相同哈希值的鍵值對。

最后我們來看看dict結構。

  1. typedef struct dict { 
  2.     dictType *type; 
  3.     void *privdata; 
  4.     dictht ht[2]; 
  5.     int reshaidx; 
  6. } dict; 

大家肯定很好奇,好好的dict,搞兩個哈希表做啥?當然也有不好奇的小伙伴,但沒辦法,架不住面試官也很好奇啊。

答案揭曉,兩個hash表是為了rehash。

那什么情況下需要rehash呢?

  • 如果redis沒在執行后臺備份,當負載因子大于等于1就執行。(反正CPU閑著也是閑著)
  • 如果redis在執行后臺備份,當負載因子大于等于5就執行。(CPU在干備份了,咱對于實在擠的表改一改,等CPU閑下來,再把稍微偏擠的rehash)

我們來看一下如果出現需要rehash的情況,需要的執行步驟:

  1. 分配空間給ht[1]。分配空間由ht[0]的具體參數決定。
  2. 將ht[0]存儲的鍵值對,重新計算hash值和索引值,并賦值到ht[1]的對應位置中。
  3. 當賦值完成后,釋放ht[0]所占用空間,并把ht[0]指向ht[1]目前的地址。
  4. ht[1]指向空表。

漸進式rehash

由于步驟二采用的計算方式如果在一定時間做,占用資源過高,所以redis提出了漸進式rehash的方式。拿大白話來講,就是原來是一次,一次性的搬運,現在變成了分批搬運。

在分批搬運的過程中,難免會收到其他各式各樣的請求。

  • 對于寫請求,即往redis哈希表增加新的鍵值對時,redis會把數據直接存放到ht[1]表中。
  • 對于查請求,即查詢特定鍵對應的值時,redis首先會在ht[0]中查找,如果查找失敗,就會在ht[1]表中查找。
  • 對于更新請求,redis首先會在ht[0]中查找,如果查找失敗,就會在ht[1]表中更新。
  • 對于刪除請求,redis首先會在ht[0]中查找,如果查找失敗,就會在ht[1]表中刪除。

參考

https://www.cnblogs.com/tekkaman/p/5141936.html

https://blog.csdn.net/yangbodong22011/article/details/78467583

Redis的設計與實現

 

Redis源碼剖析與實戰

 

責任編輯:武曉燕 來源: 后端技術小牛說
相關推薦

2024-06-13 08:01:19

2024-09-27 15:43:52

零拷貝DMAIO

2025-02-21 15:25:54

虛擬線程輕量級

2022-03-21 09:05:18

volatileCPUJava

2025-03-21 00:00:05

Reactor設計模式I/O 機制

2024-10-24 16:14:43

數據傳輸CPU零拷貝

2025-08-18 00:00:00

零拷貝系統調用函數

2024-08-27 12:36:33

2025-04-09 00:00:00

2024-10-12 16:25:12

2019-07-26 06:42:28

PG架構數據庫

2024-09-26 16:01:52

2024-08-26 14:52:58

JavaScript循環機制

2024-08-23 09:02:56

2021-11-25 10:18:42

RESTfulJava互聯網

2021-08-09 07:47:40

Git面試版本

2025-01-13 09:24:32

2020-12-01 08:47:36

Java異常開發

2020-06-12 15:50:56

options前端服務器

2021-09-27 07:11:18

MySQLACID特性
點贊
收藏

51CTO技術棧公眾號

亚洲电影一区二区| 另类中文字幕国产精品| 成人91在线| 亚洲成人精品视频| 欧美精品第三页| 欧美日韩一区二区国产| 日韩一级大片在线| 免费看涩涩视频| 日韩精品亚洲专区| 中文字幕欧美日韩va免费视频| 日韩精品免费播放| 99久久亚洲精品蜜臀| 亚洲高清免费观看| 黄频视频在线观看| 欧美人成在线| 久久久人成影片一区二区三区观看 | 日本欧美电影在线观看| 日韩深夜影院| 欧美一区二区三区系列电影| 91精品国产综合久久香蕉麻豆| 开心快乐六月丁香婷婷| 日本高清免费不卡视频| 久久久国产精品一区二区三区| 国产精品久久占久久| 国自产精品手机在线观看视频| 日韩电影免费观看高清完整版在线观看| 日韩无一区二区| caoporn免费在线| 欧美主播一区二区三区美女| 在线视频三区| 精品少妇一区二区三区视频免付费 | av在线不卡网| 国产av天堂无码一区二区三区| 99国产欧美另类久久久精品| 欧美色图色综合| 国产精品视频在线看| 777.av| 色欧美日韩亚洲| 国产一二区在线| 欧美va在线播放| 九九热线视频只有这里最精品| 色婷婷久久一区二区| 成人永久在线| 国产精品一区二区久久| 亚洲久久一区| 日韩专区第三页| 欧美高清一级片在线观看| 69日本xxxxxxxxx49| 五月激情综合色| 川上优的av在线一区二区| 精品欧美久久久| 丰满人妻中伦妇伦精品app| 麻豆精品在线观看| 欧美日韩国产综合视频在线| 美女久久一区| 精品国产一区二区三区在线| 久久久久综合网| 日本特级黄色大片| 国产精品乱码妇女bbbb| 亚洲私人影吧| 91av免费观看91av精品在线| 99久久综合狠狠综合久久| 精品久久在线| 久久亚洲一区二区三区明星换脸 | 肉体视频在线| 国产精品theporn88| 日本精品视频一区二区三区| 黄色亚洲在线| 黄网av在线| 桥本有菜av在线| 在线观看久久久久久| 成人av网站在线观看| 一区二区三区四区精品视频| 大胆高清日本a视频| 92看片淫黄大片看国产片| 一本色道久久综合亚洲aⅴ蜜桃| 少妇视频一区| 欧美专区一二三| 成人网页在线观看| 拍真实国产伦偷精品| 久久最新资源网| 北条麻妃在线| 久久不射热爱视频精品| 亚洲国产网站| 不卡av免费在线| 日韩女同互慰一区二区| 国产精品一区2区3区| 8x8ⅹ国产精品一区二区二区| 欧美午夜视频在线观看| 一区二区三区欧洲区| 一区在线电影| 在线观看av一区二区| 外国成人在线视频| 日韩精品―中文字幕| 日韩免费一区二区三区在线播放| 日韩精品免费| 日韩精品你懂的| 日韩高清人体午夜| 中文亚洲免费| 欧美黄色小说| 国产精品久久久久一区二区| 99久久精品免费看国产| 黄污视频在线观看| 国产精选在线观看91| 亚洲一区在线观看免费观看电影高清| 四虎精品永久免费| 青青草视频在线视频| 日韩一区国产二区欧美三区| 欧美日韩一区二区综合| 中文久久久久久| 国产亚洲美女精品久久久| 午夜亚洲视频| 尤物在线视频| 国产三级精品在线不卡| 亚洲福利视频一区| 亚洲区小说区图片区qvod| 亚洲中文字幕无码中文字| 亚洲天堂男人天堂| 国产精品羞羞答答xxdd| 这里有精品可以观看| 亚洲制服中文| 日韩精品亚洲精品| 免费看精品久久片| 91一区二区三区在线| 久久精品中文字幕一区二区三区| 欧美日韩一本到| 国产精品久久777777毛茸茸| av亚洲在线| 蜜桃导航-精品导航| 欧美一区二区日韩一区二区| 国产精品久久国产愉拍| 日本在线观看高清完整版| 亚洲人一区二区| 国产亚洲成av人片在线观看桃| 国产成人精品免费看| 日本免费在线一区| 亚洲欧美国产日韩综合| 日韩av理论片| 色综合久久综合网欧美综合网| 在线观看视频免费一区二区三区| 婷婷视频在线| 一区二区三区四区免费视频| 亚洲日韩中文字幕| 久久综合狠狠综合| 久久99国产精一区二区三区| 亚洲男人都懂的网站| 国产日韩一区二区三区| 精品久久久久久综合日本欧美| 另类调教123区| 韩国精品视频在线观看| 性直播在线观看| 亚洲va欧美va国产综合剧情| 欧美一级片在线看| 高清日韩电视剧大全免费| 日韩一区二区三区色| 97秋霞电影网| 痴汉一区二区三区| 亚洲第一精品福利| 91色视频在线| 久久久精品久久久久久96| 伊人电影在线观看| 亚洲熟女乱色一区二区三区 | 成人影院在线播放| 久久久久久久久久久99| 久久精品亚洲国产奇米99| 精品九九在线| 亚洲网址在线| 国产精品99久久免费| av网站一区二区三区| yy6080久久伦理一区二区| 日韩精品一区二区三区色欲av| 国产91亚洲精品| 久久久综合网站| 欧美日韩一区二区免费在线观看| 亚洲精品二三区| 99精品国产在热久久| 激情亚洲网站| 亚洲欧洲另类| 亚洲一区二区在线播放相泽| 午夜不卡一区| 曰本人一级毛片免费完整视频| 精品免费视频123区| 伊人久久久久久久久久久| 亚洲色图欧美激情| 日本va欧美va精品| 国产亚洲成av人片在线观黄桃| 2017亚洲天堂1024| 日韩久久一级片| 国产麻豆乱码精品一区二区三区 | 欧美日韩不卡合集视频| 婷婷国产在线综合| 国产一区不卡在线| re久久精品视频| 亚洲成人不卡| 一区二区三区区四区播放视频在线观看 | 国产精品日韩精品在线播放| 欧美vide| 国产成人久久婷婷精品流白浆| 国产一区二区三区无遮挡| 欧美激情极品视频|