版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
我們知道Redis?字典也會很?。當(dāng)我們使?keys命令搜尋指定模式的key時(shí),模式匹配條件的key被找到了,還需要判斷key指向的對象是否已經(jīng)過期。如果過期了就需要從主?字典中將該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)遍歷需要對這兩個(gè)hashtable依次進(jìn)?,先遍歷完舊的hashtable,再繼續(xù)遍歷新的hashtable。如果在遍歷的過程中進(jìn)?了rehashStep,將已經(jīng)遍歷過的舊的hashtable的元素遷移到了新的hashtable中,那么遍歷會不會出現(xiàn)元素的重復(fù)?這也是遍歷需要考慮的疑難之處,下?我們來看看Redis是如何解決這個(gè)問題Redis2種迭代器,?種是安全迭代器,另?}}}}}字典在擴(kuò)容的時(shí)候要進(jìn)?漸進(jìn)式遷移,會存在新舊兩個(gè)hashtable。hashtable,再繼續(xù)遍歷新的hashtable。如果在遍歷的過程中進(jìn)?了rehashStep,將已經(jīng)遍歷過的舊的hashtable的元素遷移到了新的hashtable中,那么遍歷會不會出現(xiàn)元素的重復(fù)?這也是遍歷需要考慮的疑難之處,下?我們來看看Redis是如何解決這個(gè)問題Redis為字典的遍歷提供了2種迭代器,?種是安全迭代器,另?i->safei->safe=return}typedefstructdict*dlongindex當(dāng)前遍歷的槽位置,初始化為-1inttable;//ht[0]orht[1]intsafe這個(gè)屬性?常關(guān)鍵,它表示迭代器是否安全dictEntry*entry;//迭代器當(dāng)前指向的對象dictEntry*nextEntry;//迭代器下?個(gè)指向的對象longlongfingerprint迭代器指紋,放置迭代過}獲取?安全迭代器,只讀迭代器,允許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ā)過期處理,禁?rehashStepdictIterator*dictGetSafeIterator(dict*d){dictIterator*i=i->safei->safe=return}typedefstructdictIterator{dict*d;//?標(biāo)字典對象longindex;當(dāng)前遍歷的槽位置,初始化為-inttable;//ht[0]orintsafe;這個(gè)屬性?常關(guān)鍵,它表示迭代器是否安全dictEntry*entry;//迭代器當(dāng)前指向的對象dictEntry*nextEntry;//迭代器下?個(gè)指向的對象longlongfingerprint;//迭代器指紋,放置迭代過}獲取?安全迭代器,只讀迭代器,允許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ā)過期處理,禁?rehashStepdictIterator*dictGetSafeIterator(dict*d){dictIterator*i=dictGetIterator(d);重復(fù),就會禁?rehashStep。dictNext對字典進(jìn)?持續(xù)遍歷,不得調(diào)?任何可能觸發(fā)過期判斷的函數(shù)。不過好處是不影響rehash,代價(jià)就是遍歷的記,rehashStep就不會執(zhí)?,遍歷時(shí)元素就不會出現(xiàn)重復(fù)。typedeftypedefstruct{dictType*type;void*privdata;dicththt[2];longrehashidx;量unsignedlong}//如果存在安全的迭代器,就禁?rehashstaticvoid_dictRehashStep(dict*dif(d->iterators==0)}?掛接的鏈表中的元素可能會被摘?,元素的next指針就會發(fā)?變重復(fù),就會禁?rehashStep。改,你只能調(diào)?dictNext對字典進(jìn)?持續(xù)遍歷,不得調(diào)?任何可能觸發(fā)過期判斷的函數(shù)。不過好處是不影響rehash,代價(jià)就是遍歷的記,rehashStep就不會執(zhí)?,遍歷時(shí)元素就不會出現(xiàn)重復(fù)。typedeftypedefstructdict{dictType*type;void*privdata;dicththt[2];longrehashidx;量unsignedlong}//如果存在安全的迭代器,就禁?rehashstaticvoid_dictRehashStep(dict*d)if(d->iterators==0)}?掛接的鏈表中的元素可能會被摘?,元素的next指針就會發(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租客有老人小孩租房合同(2篇)
- 巜趙州橋 課件
- 西南林業(yè)大學(xué)《茶藝》2023-2024學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《設(shè)計(jì)表現(xiàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 探究水溫對金魚呼吸的影響
- 新人教版五年級上冊用字母表示數(shù)例3教程
- 西京學(xué)院《工程力學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《安裝工程計(jì)量與計(jì)價(jià)》2021-2022學(xué)年第一學(xué)期期末試卷
- 西華師范大學(xué)《數(shù)字電子技術(shù)基礎(chǔ)》2022-2023學(xué)年期末試卷
- 描寫眼睛 課件
- 《傳感器原理及應(yīng)用》全套教學(xué)課件
- 文物與博物館學(xué)課件
- 高精度時(shí)間同步及定位技術(shù)應(yīng)用白皮書
- 短暫性腦缺血發(fā)作培訓(xùn)課件
- 新版統(tǒng)編版三年級上冊語文《大自然的聲音》課件(第二課時(shí))
- 首件驗(yàn)收報(bào)驗(yàn)表
- 小學(xué)科學(xué)教育科學(xué)三年級上冊空氣《風(fēng)的成因》教案
- 四年級上冊數(shù)學(xué)課件 《平行與垂直》 人教版(共11張PPT)
- 出砂機(jī)理及防砂
- 火炬系統(tǒng)水封罐計(jì)算
- 奧托尼克斯計(jì)米器使用說明書
評論
0/150
提交評論