Redis筆記(三)- 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)_Hash和Set

Redis的hash結(jié)構(gòu)跟Java的HashMap十分相似,同樣都是用數(shù)組加鏈表組成(還是是數(shù)組和鏈表侦讨,和上一節(jié)的quicklist組成是一樣的吧窘面,只不過(guò)quicklist的結(jié)構(gòu)是由數(shù)組組成的鏈表,而hash則是由鏈表組成的數(shù)組)件相。Set內(nèi)部結(jié)構(gòu)也是hash再扭,只不過(guò)hashEntry中所有的 value 都是一個(gè)值NULL(又抄我java)。hash表就不多說(shuō)了夜矗,直接上圖泛范,哦,這里要注意紊撕,hash結(jié)構(gòu)的值只能是string類型(redis中整數(shù)什么的都可以視為string)罢荡。


hash.png

探索hash字典內(nèi)部原理

struct hashEntry {
    void* key;
    void* val;
    hashEntry* next; // 下一個(gè) entry的地址值
}
struct hashTable{
    hashEntry** table; // 二維數(shù)組,相當(dāng)于java中的 new Entry[][]
    long size; // 第一維數(shù)組的長(zhǎng)度对扶,hash表中數(shù)組部分的長(zhǎng)度
    long used; // hash 表中的所有元素個(gè)數(shù)
    ...
}

這個(gè)二維數(shù)組的行代表著hash表中數(shù)組的部分的長(zhǎng)度区赵,列代表著hash表中的每一個(gè)鏈表的長(zhǎng)度。

兩個(gè)hashTable

實(shí)際上浪南,每個(gè)hash類型的數(shù)據(jù)結(jié)構(gòu)里面都會(huì)有兩個(gè)hashTable笼才,就是因?yàn)樵跀U(kuò)容的時(shí)候采取了一種漸進(jìn)式的擴(kuò)容方式,這種方式會(huì)提前創(chuàng)建一個(gè)新的hashtable络凿,容量為當(dāng)前used*2骡送,觸發(fā)擴(kuò)容條件時(shí)昂羡,將老hashTable的數(shù)據(jù)分批次遷移到新的hashtable當(dāng)中,這種方式最大的好處就是不會(huì)因?yàn)橐淮涡赃w移的數(shù)據(jù)量太大而導(dǎo)致讀寫的阻塞摔踱。(CopyOnWriteArrayList是嘛)

在讀請(qǐng)求進(jìn)來(lái)時(shí)虐先,如果發(fā)現(xiàn)擴(kuò)容還未結(jié)束,會(huì)先從老hashTable查派敷,查不到會(huì)再?gòu)男碌膆ashTable查赴穗。而有寫請(qǐng)求時(shí),會(huì)順便將這個(gè)元素rehash一次膀息,把值直接存到新hashTable中般眉。

擴(kuò)容時(shí)機(jī)

1.當(dāng)hash中元素總個(gè)數(shù)=hash中數(shù)組的長(zhǎng)度時(shí),且沒(méi)有正在進(jìn)行bgsave或bgrewriteaof操作(持久化內(nèi)存快照)潜支。
2.當(dāng)hash中元素總個(gè)數(shù)=hash中數(shù)組的長(zhǎng)度的5倍時(shí)甸赃,即使正在進(jìn)行bgsave或bgrewriteaof操作,也會(huì)強(qiáng)制擴(kuò)容冗酿。(我覺得紅黑樹還能再挺一下)

縮容時(shí)機(jī)

當(dāng)hash中元素總個(gè)數(shù)=hash中數(shù)組的長(zhǎng)度的1/10時(shí)埠对,便會(huì)縮容。

Set中的intset
struct intset {
    uint32_t encoding;//編碼方式裁替,可選16/32/64位
    uint32_t length;//數(shù)組長(zhǎng)度
    int8_t contents[];//元素
}
intset.png

當(dāng)set內(nèi)元素個(gè)數(shù)較少且都為整型時(shí)项玛,set內(nèi)部結(jié)構(gòu)會(huì)優(yōu)化為一個(gè)intset,結(jié)構(gòu)和壓縮列表類似弱判,不過(guò)intset的元素都為整型襟沮,在intset中定位一個(gè)元素時(shí),會(huì)使用二分法查找昌腰,時(shí)間復(fù)雜度為O(logn)开伏。
intset 只能升級(jí),不能降級(jí)遭商。將一個(gè)大于當(dāng)前encoding位數(shù)的元素插入到intset 固灵,會(huì)導(dǎo)致intset升級(jí),或者直接變成hash結(jié)構(gòu)劫流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巫玻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子祠汇,更是在濱河造成了極大的恐慌仍秤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座哩,死亡現(xiàn)場(chǎng)離奇詭異徒扶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)根穷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門姜骡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)导坟,“玉大人,你說(shuō)我怎么就攤上這事圈澈”怪埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵康栈,是天一觀的道長(zhǎng)递递。 經(jīng)常有香客問(wèn)我,道長(zhǎng)啥么,這世上最難降的妖魔是什么登舞? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮悬荣,結(jié)果婚禮上菠秒,老公的妹妹穿的比我還像新娘。我一直安慰自己氯迂,他們只是感情好践叠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚼蚀,像睡著了一般禁灼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轿曙,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天弄捕,我揣著相機(jī)與錄音,去河邊找鬼拳芙。 笑死察藐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舟扎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悴务,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼睹限!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起讯檐,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤羡疗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后别洪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叨恨,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年挖垛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痒钝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉颗。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖送矩,靈堂內(nèi)的尸體忽然破棺而出蚕甥,到底是詐尸還是另有隱情,我是刑警寧澤栋荸,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布菇怀,位于F島的核電站,受9級(jí)特大地震影響晌块,放射性物質(zhì)發(fā)生泄漏爱沟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一匆背、第九天 我趴在偏房一處隱蔽的房頂上張望呼伸。 院中可真熱鬧,春花似錦靠汁、人聲如沸蜂大。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奶浦。三九已至,卻和暖如春踢星,著一層夾襖步出監(jiān)牢的瞬間澳叉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工沐悦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留成洗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓藏否,卻偏偏與公主長(zhǎng)得像瓶殃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子副签,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 前言 Redis的5種數(shù)據(jù)類型(String遥椿,Hash,List淆储,Set冠场,Sorted Set),每種數(shù)據(jù)類型...
    LZhan閱讀 382評(píng)論 0 2
  • 一本砰、String 1.1.數(shù)據(jù)結(jié)構(gòu) 注:數(shù)組大小=len+free+1(字符的‘\0’休止符) 1.2.空間分配策...
    愛情小傻蛋閱讀 1,758評(píng)論 2 0
  • 1.演示數(shù)據(jù)類型的實(shí)現(xiàn) 上篇博客我們?cè)诮榻B key 相關(guān)命令的時(shí)候碴裙,介紹了如下命令: ``` OBJECT ENC...
    mkdlp閱讀 397評(píng)論 0 0
  • 上一篇文章詳細(xì)介紹了Redis的五種常用數(shù)據(jù)類型舔株,每種數(shù)據(jù)類型在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)都會(huì)因情況而異莺琳。接下來(lái),我會(huì)用幾篇...
    Javar閱讀 1,898評(píng)論 0 2
  • 目錄 1督笆、演示數(shù)據(jù)類型的實(shí)現(xiàn) 2芦昔、簡(jiǎn)單動(dòng)態(tài)字符串 3、鏈表 4娃肿、字典 5咕缎、跳躍表 6、整數(shù)集合 7料扰、壓縮列表 8凭豪、...
    匆匆歲月閱讀 1,177評(píng)論 0 28