




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
我們知道Redis?字典也會(huì)很?。當(dāng)我們使?keys命令搜尋指定模式的key時(shí),模式匹配條件的key被找到了,還需要判斷key指向的對(duì)象是否已經(jīng)過(guò)期。如果過(guò)期了就需要從主?字典中將該key刪除。voidkeysCommand(client*c){dictIterator*di;//迭代器dictEntry*de;迭代器當(dāng)前的entrysdspatternc->argv[1]->ptr;keys的匹配模intplen=intallkeys;是否要獲取所有key,?于keys*這樣unsignedlongnumkeys=0;void*replylen=//whydi=dictGetSafeIterator(c->db->dict);allkeys=(pattern[0]=='*'&&pattern[1]==while((de=dictNext(di))!=NULL){sdskey=dictGetKey(de);robjif(allkeys||stringmatchlen(pattern,plen,key,sdslen(key),0)){keyobj=if(expireIfNeeded(c->db,keyobj)0)遍歷需要對(duì)這兩個(gè)hashtable依次進(jìn)?,先遍歷完舊的hashtable,再繼續(xù)遍歷新的hashtable。如果在遍歷的過(guò)程中進(jìn)?了rehashStep,將已經(jīng)遍歷過(guò)的舊的hashtable的元素遷移到了新的hashtable中,那么遍歷會(huì)不會(huì)出現(xiàn)元素的重復(fù)?這也是遍歷需要考慮的疑難之處,下?我們來(lái)看看Redis是如何解決這個(gè)問(wèn)題Redis2種迭代器,?種是安全迭代器,另?}}}}}字典在擴(kuò)容的時(shí)候要進(jìn)?漸進(jìn)式遷移,會(huì)存在新舊兩個(gè)hashtable。hashtable,再繼續(xù)遍歷新的hashtable。如果在遍歷的過(guò)程中進(jìn)?了rehashStep,將已經(jīng)遍歷過(guò)的舊的hashtable的元素遷移到了新的hashtable中,那么遍歷會(huì)不會(huì)出現(xiàn)元素的重復(fù)?這也是遍歷需要考慮的疑難之處,下?我們來(lái)看看Redis是如何解決這個(gè)問(wèn)題Redis為字典的遍歷提供了2種迭代器,?種是安全迭代器,另?i->safei->safe=return}typedefstructdict*dlongindex當(dāng)前遍歷的槽位置,初始化為-1inttable;//ht[0]orht[1]intsafe這個(gè)屬性?常關(guān)鍵,它表示迭代器是否安全dictEntry*entry;//迭代器當(dāng)前指向的對(duì)象dictEntry*nextEntry;//迭代器下?個(gè)指向的對(duì)象longlongfingerprint迭代器指紋,放置迭代過(guò)}獲取?安全迭代器,只讀迭代器,允許rehashStepdictIterator*dictGetIterator(dict*d){dictIterator*iter=iter->d=d;iter->table=0;iter->index=-iter->safe=0;iter->entry=NULL;iter->nextEntry=NULL;returniter;}獲取安全迭代器,允許觸發(fā)過(guò)期處理,禁?rehashStepdictIterator*dictGetSafeIterator(dict*d){dictIterator*i=i->safei->safe=return}typedefstructdictIterator{dict*d;//?標(biāo)字典對(duì)象longindex;當(dāng)前遍歷的槽位置,初始化為-inttable;//ht[0]orintsafe;這個(gè)屬性?常關(guān)鍵,它表示迭代器是否安全dictEntry*entry;//迭代器當(dāng)前指向的對(duì)象dictEntry*nextEntry;//迭代器下?個(gè)指向的對(duì)象longlongfingerprint;//迭代器指紋,放置迭代過(guò)}獲取?安全迭代器,只讀迭代器,允許rehashStepdictIterator*dictGetIterator(dict*d){dictIterator*iter=iter->d=d;iter->table=0;iter->index=-iter->safe=0;iter->entry=NULL;iter->nextEntry=NULL;returniter;}獲取安全迭代器,允許觸發(fā)過(guò)期處理,禁?rehashStepdictIterator*dictGetSafeIterator(dict*d){dictIterator*i=dictGetIterator(d);重復(fù),就會(huì)禁?rehashStep。dictNext對(duì)字典進(jìn)?持續(xù)遍歷,不得調(diào)?任何可能觸發(fā)過(guò)期判斷的函數(shù)。不過(guò)好處是不影響rehash,代價(jià)就是遍歷的記,rehashStep就不會(huì)執(zhí)?,遍歷時(shí)元素就不會(huì)出現(xiàn)重復(fù)。typedeftypedefstruct{dictType*type;void*privdata;dicththt[2];longrehashidx;量unsignedlong}//如果存在安全的迭代器,就禁?rehashstaticvoid_dictRehashStep(dict*dif(d->iterators==0)}?掛接的鏈表中的元素可能會(huì)被摘?,元素的next指針就會(huì)發(fā)?變重復(fù),就會(huì)禁?rehashStep。改,你只能調(diào)?dictNext對(duì)字典進(jìn)?持續(xù)遍歷,不得調(diào)?任何可能觸發(fā)過(guò)期判斷的函數(shù)。不過(guò)好處是不影響rehash,代價(jià)就是遍歷的記,rehashStep就不會(huì)執(zhí)?,遍歷時(shí)元素就不會(huì)出現(xiàn)重復(fù)。typedeftypedefstructdict{dictType*type;void*privdata;dicththt[2];longrehashidx;量unsignedlong}//如果存在安全的迭代器,就禁?rehashstaticvoid_dictRehashStep(dict*d)if(d->iterators==0)}?掛接的鏈表中的元素可能會(huì)被摘?,元素的next指針就會(huì)發(fā)?變ifif(dictIsRehashing(iter->d)iter->table==0)dictEntry*dictNext(dictIterator{while(1)if(iter->entry==NULL)遍歷?個(gè)新槽位下?的鏈表,數(shù)組的index==0)表
dictht*ht=&iter->d-if(iter->index==-1&&iter-也就是ht[0]if(iter->safe)}else記錄迭代器指紋,就好?字典的md5}
iter->index++index=0if(iter->index>=(long)ht->size)ifif(dictIsRehashing(iter->d)iter->table==0)dictEntry*dictNext(dictIterator{while(1)if(iter->entry==NULL)遍歷?個(gè)新槽位下?的鏈表,數(shù)組的index==0)表
dictht*ht=&iter->d-if(iter->index==-1&&iter-也就是ht[0]if(iter->safe)}else記錄迭代器指紋,就好?字典的md5iter->fingerprint}
iter->index++;index=0if(iter->index>=(long)ht->size)iteriter->nextEntry=iter->entry-returniter-第?個(gè)
iter->index=0;ht=&iter->d-}else}}iter->entry=ht->table[iter-}elseiter->entry=iter-}if(iter->entry)鍵試想如果后?發(fā)?了rehash,當(dāng)前遍歷的鏈表舊的鏈表將?分為?,打散后重新掛接到新數(shù)如果rehash的鏈表是index前?的鏈表,那么iteriter->nextEntry=iter->entry-returniter-第?個(gè)
如果處于rehashiter->index=0;ht=&iter->d-}else}}iter->entry=ht->table[iter-}elseiter->entry=iter-}if(iter->entry)鍵試想如果后?發(fā)?了rehash,當(dāng)前遍歷的鏈表
如果rehash的鏈表是index前?的鏈表,那么}}return}}return}====(long)d-{if(!(iter->index==-1&&iter->table=={if(iter-iter->d->iterators去掉禁?
}}longlongdictFingerprint(dict{longlongintegers[6],hash=0;intj;voiddictReleaseIterator(dictIterator{if(!(iter->index==-1&&iter->table=={if(iter-iter->d->iterators去掉禁?
assert(iter->fingerprint}}如果只是某個(gè)元素的valuelonglongdictFingerprint(dict*d){longlongintegers[6],hash=0;intj;====(long)d-for(j=0;j<6;{+=hash(~hash)+(hash<<hashhash^(hash>>hash(hash+(hash<<3))+(hashhashhash^(hash>>hash(hash+(hash<<2))+(hashhashhash^(hash>>hashhash+(hash<<}return}值得注意的是在字典擴(kuò)容時(shí)進(jìn)?rehash,將舊數(shù)組中的鏈表遷移到hashhashmod2^n=hashmod2^(n+1)=korkeys指令使?了安全迭代器,因?yàn)榻Y(jié)果不允許重復(fù)。那還有其===(long)d-forfor(j=0;j<6;j++){hash+=integers[j];hash=(~hash)+(hash<<21);hash=hash^(hash>>24);hash=(hash+(hash<<3))+(hashhash=hash^(hash>>hash=(hash+(hash<<
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)庫(kù)機(jī)械租賃合同范本
- 凍肉投放合同范本
- 加工制作合同范本門窗
- 產(chǎn)品推廣居間合同范本
- 加盟合同范本奶茶
- 健身收購(gòu)合同范本
- 出租黃色圍擋合同范例
- 中國(guó)國(guó)家展覽中心合同范例
- 住宅租賃房屋合同范例
- 2024年溫州鹿城農(nóng)商銀行招聘筆試真題
- 2024年度-銀行不良清收技巧培訓(xùn)課件(學(xué)員版)
- 《書籍裝幀設(shè)計(jì)》 課件 項(xiàng)目3 書籍裝幀整體設(shè)計(jì)
- 【可行性報(bào)告】2023年糧油加工項(xiàng)目可行性研究分析報(bào)告
- 部編版小學(xué)語(yǔ)文四年級(jí)下冊(cè)第二單元教材分析
- (西師大版)數(shù)學(xué)二年級(jí)下冊(cè)“雙減”下的堂上作業(yè)設(shè)計(jì)
- 參考消息電子版在線閱讀(角度區(qū))
- 2024年山東省春季高考技能考試汽車專業(yè)試題庫(kù)-上(單選題匯總)
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 2016-2023年湖南鐵路科技職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 2016-2023年江蘇農(nóng)林職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 狼道的讀后感課件
評(píng)論
0/150
提交評(píng)論