日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Redis之字典(hashtable)

發(fā)布時(shí)間:2025/3/21 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis之字典(hashtable) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Redis之字典

  • 字典是什么(hashtable)
  • 總體結(jié)構(gòu)
  • dict
    • dictht(散列表)
      • dictEntry
  • 如何解決哈希沖突
    • 1. 鏈表法
    • 2.rehash法

字典是什么(hashtable)

簡(jiǎn)單來(lái)說(shuō)就是Redis中hash數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)
當(dāng)數(shù)據(jù)小, 并且數(shù)量不多的時(shí)候會(huì)用ziplist來(lái)實(shí)現(xiàn)hash結(jié)構(gòu)

總體結(jié)構(gòu)

這里先給出大體的結(jié)構(gòu), 便于理解

dict

字典底層又是由dict實(shí)現(xiàn)的, 下圖是dict的結(jié)構(gòu)

typedef struct dict{//類型特定函數(shù)void *type;//私有數(shù)據(jù)void *privdata;//哈希表(散列表)dictht ht[2];//rehash 索引 當(dāng)rehash不在進(jìn)行時(shí) 值為-1int trehashidx; }dict;

dictht[]數(shù)組長(zhǎng)度為2, 一般我們使用dictht[0], 另外一個(gè)dictht[1]作為rehash使用

dictht(散列表)

接下來(lái)我們看一下dictht(散列表的實(shí)現(xiàn))

typedef struct dictht {//哈希表數(shù)組dictEntry **table;//哈希表大小unsigned long size;//哈希表大小掩碼,用于計(jì)算索引值unsigned long sizemask;//該哈希已有節(jié)點(diǎn)的數(shù)量unsigned long used; }dictht;

dictEntry

  • dictEntry是一個(gè)散列表節(jié)點(diǎn)
    散列表的節(jié)點(diǎn)是由下定義的
//哈希表節(jié)點(diǎn)定義dictEntry結(jié)構(gòu)表示,每個(gè)dictEntry結(jié)構(gòu)都保存著一個(gè)鍵值對(duì)。 typedef struct dictEntry {//鍵void *key;//值union{void *val;uint64_tu64;int64_ts64;}v;// 指向下個(gè)哈希表節(jié)點(diǎn),形成鏈表struct dictEntry *next; }dictEntry;
  • key就是實(shí)際存儲(chǔ)鍵的地方
  • 聯(lián)合體中就是實(shí)際存儲(chǔ)值的地方
  • 散列表節(jié)點(diǎn)還有一個(gè)next域指向下一個(gè)節(jié)點(diǎn), 可以用來(lái)解決哈希沖突問(wèn)題

如何解決哈希沖突

1. 鏈表法

當(dāng)有兩個(gè)或以上的鍵被分配到散列表數(shù)組同一個(gè)索引上時(shí),就發(fā)生了鍵沖突。Redis使用鏈表法解決散列沖突。
值得一提的是比如V0先加入這個(gè)節(jié)點(diǎn)中, 又來(lái)一個(gè)V1和V0的值一個(gè)都被分配 到了一個(gè)地址, 那么就會(huì)在V0的頭部插入V1.

2.rehash法

隨著操作的進(jìn)行, dict內(nèi)保存的鍵值對(duì),會(huì)不斷的減少或者增加, 我們需要保證負(fù)載因子的正常, 那么就要重新進(jìn)行分配內(nèi)存
這個(gè)時(shí)候dicht[1]就可以起到作用了, 并且rehashids也會(huì)設(shè)置為0表示正在rehash中

rehash的過(guò)程
1.為字典的ht[1]散列表分配空間,這個(gè)空間的大小取決于要執(zhí)行的操作以及ht[0]當(dāng)前包含的鍵值對(duì)數(shù)量(即:ht[0].used的屬性值)

  • 擴(kuò)展操作:ht[1]的大小為 第一個(gè)大于等于ht[0].used2的2的n次方冪。如:ht[0].used=3則ht[0] = 32 = 6, 第一個(gè)大于或者等于的2^n就是 2 ^ 3=8所以ht[1]的大小為8,ht[0].used=4則ht[1]的大小也為8。
  • 收縮操作: ht[1]的大小為 第一個(gè)大于等于ht[0].used的2的n次方冪。

2.將保存在ht[0]中的鍵值對(duì)重新計(jì)算鍵的散列值和索引值,然后放到ht[1]指定的位置上. 當(dāng)然這不是一步完成的, 是一部分一部分的賦值過(guò)去
3.當(dāng)我們把ht[0]上面所有的鍵值對(duì)都給移過(guò)去到h[1]之后, 就會(huì)釋放h[0]的空間, 并且將h[1]記為ht[0], 最后再創(chuàng)建一個(gè)新的ht[1]散列表為下一次rehash做準(zhǔn)備。

這就是本次全部?jī)?nèi)容,若是看不懂建立配合著圖來(lái)理解

總結(jié)

以上是生活随笔為你收集整理的Redis之字典(hashtable)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲色图欧美另类 | 午夜免费影院 | 91蜜桃 | 亚洲A∨无码国产精品 | 五月激情四射网 | 成人av毛片 | 久久久精品一区二区三区 | 午夜性福利视频 | 欧美第一色 | 欧美一区二区三区公司 | 最近中文字幕免费 | 日本在线www| 黄色aaaa | 国产精品theporn88 | 欧美 在线 | 免费观看久久久 | 欧美精品网 | 在线观看麻豆视频 | 午夜性色| 国内自拍小视频 | 国产av无码专区亚洲av | jizz中国少妇| 三级av网址 | 精品无码一区二区三区 | 美女扒开粉嫩的尿囗给男生桶 | 中国美女毛片 | 亚洲国产精品无码专区 | 人人干夜夜操 | 黄色片女人 | 日日爱99| 亚洲成人av免费 | 国产精品短视频 | 欧美成人黄色小视频 | 少妇2做爰bd在线意大利堕落 | 亚洲涩涩在线 | www.污在线观看 | 免费黄色成人 | 日本一区免费视频 | 成人污在线观看 | 又色又爽又黄无遮挡的免费视频 | 日韩免费福利视频 | 五月激情六月丁香 | 香蕉福利视频 | 一区二区三区视频在线播放 | 破处视频在线观看 | 久久久久一区 | 日本不卡一区 | 亚洲色图国产视频 | 国产一区二区女内射 | 国产午夜一级一片免费播放 | 亚洲永久精品视频 | 亚洲女同av | 国产熟妇另类久久久久 | 日韩人妻无码一区二区三区99 | 少妇av一区二区三区无码 | www色综合 | 日本黄色美女网站 | 日本不卡一区二区在线观看 | 成人短视频在线观看 | 三上悠亚久久 | 波多野结衣av片 | 日本不卡一二三 | 91亚色| 欧美日韩免费网站 | 2021国产精品视频 | 成人国产精品一区 | 四虎久久| 四川丰满少妇被弄到高潮 | 午夜在线国产 | 日韩伦理一区二区三区 | 国产ts丝袜人妖系列视频 | 法国伦理少妇愉情 | 欧美色国 | yjizz国产| 国产传媒第一页 | 日韩午夜毛片 | 免费的毛片 | 免费黄色小视频在线观看 | 美女毛片网站 | 欧美乱码视频 | 色婷亚洲 | www.欧美成人| 国产精品69久久久 | 一区二区毛片 | 强videoshd酒醉 | xxxxxx日本 | 日日舔夜夜摸 | 国产精品视频一区二区三区不卡 | 天美乌鸦星空mv | 男女无遮挡网站 | 黄色aaa视频 | 无码人妻精品一区二区三区9厂 | 国产综合视频一区 | 国产骚b | 初尝人妻少妇中文字幕 | 99国内揄拍国内精品人妻免费 | 欧美性69 | 国产精品二区在线观看 | 国产精品视频合集 |