青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰(shuí)的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

tokyocabinet1.4.19閱讀筆記(二)hash數(shù)據(jù)庫(kù)查找key流程

這一節(jié)關(guān)注TC中的hash數(shù)據(jù)庫(kù)如何根據(jù)一個(gè)key查找到該key所在的record,因?yàn)楹罄m(xù)的刪除,插入記錄都是以查找為基礎(chǔ)的,所以首先描述這部分內(nèi)容.

從上一節(jié)的概述中,可以看到record結(jié)構(gòu)體中有兩個(gè)成員left,right:
typedef struct {                         // type of structure for a record
  uint64_t off;                          // offset of the record
  uint32_t rsiz;                         // size of the whole record
  uint8_t magic;                         // magic number
  uint8_t hash;                          // second hash value
  uint64_t left;                         // offset of the left child record
  uint64_t right;                        // offset of the right child record
  uint32_t ksiz;                         // size of the key
  uint32_t vsiz;                         // size of the value
  uint16_t psiz;                         // size of the padding
  const char *kbuf;                      // pointer to the key
  const char *vbuf;                      // pointer to the value
  uint64_t boff;                         // offset of the body
  char *bbuf;                            // buffer of the body
} TCHREC;
說(shuō)明,每個(gè)record是存放在一個(gè)類二叉樹(shù)的結(jié)構(gòu)中的.

實(shí)際上,TC會(huì)首先根據(jù)一個(gè)record的key去算出該key所在的bucket index以及hash index,代碼如下:
/* Get the bucket index of a record.
   `hdb' specifies the hash database object.
   `kbuf' specifies the pointer to the region of the key.
   `ksiz' specifies the size of the region of the key.
   `hp' specifies the pointer to the variable into which the second hash value is assigned.
   The return value is the bucket index. 
*/
static uint64_t tchdbbidx(TCHDB *hdb, const char *kbuf, int ksiz, uint8_t *hp){
  assert(hdb 
&& kbuf && ksiz >= 0 && hp);
  uint64_t idx 
= 19780211;
  uint32_t hash 
= 751;
  
const char *rp = kbuf + ksiz;
  
while(ksiz--){
    idx 
= idx * 37 + *(uint8_t *)kbuf++;
    hash 
= (hash * 31^ *(uint8_t *)--rp;
  }
  
*hp = hash;
  
return idx % hdb->bnum;
}
需要特別提醒的一點(diǎn)是,上面的算法中,根據(jù)key算出所在的bucket index,是經(jīng)過(guò)模TCHDB->bnum之后的結(jié)果,也就是說(shuō),這個(gè)值是有限制的---最大不能超過(guò)TCHDB初始化時(shí)得到的bucket最大數(shù)量;而算出的二級(jí)hash值,我是沒(méi)有看出來(lái)有數(shù)值上的限制的,為什么?看了后面的內(nèi)容就明白了.

因此,所有根據(jù)記錄的key算出bucket index相同的記錄全都以二叉樹(shù)的形式組織起來(lái),而每個(gè)bucket array元素存放的整型值就是該bucket樹(shù)根所在記錄的offset.

到此,相關(guān)的結(jié)構(gòu)體聯(lián)系都清楚了,下面的流程圖給出了查找一個(gè)key的記錄是否存在的流程:


簡(jiǎn)單的解釋一下,這個(gè)查找的流程就是首先根據(jù)查找的key算出所在的bucket,然后在這個(gè)bucket的二叉樹(shù)中按照條件遍歷的過(guò)程.

前面提到過(guò),bucket array是整個(gè)被mmap映射到共享內(nèi)存中去的.我們來(lái)做一個(gè)估計(jì),假設(shè)存放bucket array的內(nèi)存使用了1G,而真正存放record的文件長(zhǎng)度有16G,也就是,bucket array的元素與記錄大概是1:16的關(guān)系,假設(shè)所選的hash算法足夠的好,以至于每個(gè)記錄的key可以較為平均的分布在不同的bucket index上,也就是每個(gè)bucket array的元素組成的二叉樹(shù)上平均有16個(gè)元素,那么也就最多需要O(4)次讀取文件I/O(每次去讀取記錄的數(shù)據(jù)都是一次讀磁盤操作) + O(1)次內(nèi)存讀操作(因?yàn)樾枰赽ucket array中得到樹(shù)根元素的offset).

但是等等,上面還有一些細(xì)節(jié)沒(méi)有交待清楚.

首先,上面的二叉樹(shù)不是類似AVL,紅黑樹(shù)這樣的平衡二叉查找樹(shù),也就是說(shuō),很可能在極端的情況下演變成一個(gè)鏈表---樹(shù)的一邊沒(méi)有元素,另一邊有全部的元素.
其次,上面的流程圖中還有一點(diǎn)就是每次比較首先比較的是hash值,這個(gè)值的奧秘就在于解決上面提到的那個(gè)問(wèn)題.既然只是一個(gè)普通的二叉樹(shù),無(wú)法保證平衡,那么就通過(guò)算出這個(gè)二級(jí)的hash值來(lái)保證平衡---當(dāng)然,前提依然是所選擇的hash算法足夠的好,可以保證key平均的分布.

前面提到過(guò),非平衡的二叉樹(shù)只會(huì)在極端的情況下才會(huì)演變?yōu)橐粋€(gè)極端不平衡的二叉樹(shù)--鏈表,而諸如AVL,紅黑樹(shù)之類的平衡二叉樹(shù),算法編碼都相對(duì)復(fù)雜,調(diào)試起來(lái)也麻煩,出錯(cuò)了要跟進(jìn)更麻煩,另外還別忘了,這些平衡二叉樹(shù)之所以能保持平衡,在刪除/增加元素時(shí)做的讓樹(shù)重新平衡的操作,比如旋轉(zhuǎn)等,都是要涉及到讀寫樹(shù)結(jié)點(diǎn)的,而這些,目前都是存放在磁盤上的---也就是這是相對(duì)較費(fèi)時(shí)的操作,所以問(wèn)題在于:是不是值得為這一個(gè)極端的情況去優(yōu)化?另外,引入二級(jí)hash就是為了部分解決這個(gè)極端不平衡問(wèn)題,它的思路簡(jiǎn)單也容易實(shí)現(xiàn),但是引入的另外一個(gè)問(wèn)題就是每次查找時(shí)根據(jù)key去算bucket index的時(shí)候,還要耗費(fèi)時(shí)間去算hash index了.

平衡點(diǎn),還是平衡點(diǎn).時(shí)間還是空間,這是一個(gè)問(wèn)題.

所以,經(jīng)過(guò)對(duì)TC的hash數(shù)據(jù)庫(kù)查找key流程的分析,最大的感受是:它沒(méi)有使用復(fù)雜的算法與數(shù)據(jù)結(jié)構(gòu),而是通過(guò)一些巧妙的優(yōu)化如二級(jí)hash的引入,達(dá)到了系統(tǒng)效率和編碼調(diào)試復(fù)雜度之間一個(gè)較好的平衡.學(xué)會(huì)"平衡"各種因素,是做項(xiàng)目做事情,都要掌握的一個(gè)技能,而這個(gè),只有多經(jīng)歷多想才能慢慢積累了.

好了,簡(jiǎn)單的回顧整個(gè)查找key的關(guān)鍵點(diǎn):
1) 所有的record是以二叉樹(shù)的形式組織在同一個(gè)bucket上面的.
2) 這個(gè)二叉樹(shù)不是平衡的二叉樹(shù)
3) 為了解決問(wèn)題二造成的極端不平衡問(wèn)題,TC引入了二級(jí)hash,以保證這個(gè)二叉樹(shù)盡可能的平衡.

以上,就是TC對(duì)記錄,bucket的組織情況,以及整個(gè)查找算法的流程.可以看到,算法,結(jié)構(gòu)體定義等等都不復(fù)雜,但是由于巧妙的構(gòu)思,既可以使用盡可能簡(jiǎn)單的算法/數(shù)據(jù)結(jié)構(gòu),又能規(guī)避可能出現(xiàn)的一些隱患,同時(shí)還能保證查找的高效率.

查找是key-value形式存儲(chǔ)的核心流程,能夠?qū)⑦@個(gè)流程優(yōu)化,對(duì)整個(gè)系統(tǒng)的性能也有很大的影響.



posted on 2010-01-12 19:25 那誰(shuí) 閱讀(6637) 評(píng)論(6)  編輯 收藏 引用 所屬分類: tokyo cabinet

評(píng)論

# re: tokyocabinet1.4.19閱讀筆記(二)hash數(shù)據(jù)庫(kù)查找key流程  回復(fù)  更多評(píng)論   

找到工作了嗎?呵呵
2010-01-12 19:26 | code

# re: tokyocabinet1.4.19閱讀筆記(二)hash數(shù)據(jù)庫(kù)查找key流程  回復(fù)  更多評(píng)論   

@code
汗,你這個(gè)回復(fù)也太快了吧.
呵呵,周四去面試.
2010-01-12 19:29 | 那誰(shuí)

# re: tokyocabinet1.4.19閱讀筆記(二)hash數(shù)據(jù)庫(kù)查找key流程  回復(fù)  更多評(píng)論   

汗啊,發(fā)現(xiàn)TC的設(shè)計(jì)和我之前用于分詞的XDB詞典,以前最近所思考的以crc32值計(jì)算后先做比較而期待是否能得到近似平橫的二叉樹(shù),很接近!

實(shí)際測(cè)試后(用連續(xù)的1,2,3...作key或隨機(jī)生成的字符串做key分別測(cè)試)
用crc32大體能保持相對(duì)于根結(jié)點(diǎn)的左右子樹(shù)元素平橫,樹(shù)的高度也能平橫,但樹(shù)的高度卻是平橫樹(shù)的2倍左右。。。

也就是說(shuō) 2萬(wàn)個(gè)元素就會(huì)達(dá)到 32 左右的樹(shù)高,這樣感覺(jué)價(jià)值不大所以立即放棄,看上去還是要用B+樹(shù)才比較好。
2010-02-01 23:16 | hightman

# re: tokyocabinet1.4.19閱讀筆記(二)hash數(shù)據(jù)庫(kù)查找key流程  回復(fù)  更多評(píng)論   

由此看出來(lái)其實(shí)tc的設(shè)計(jì)還有好多地方可以改進(jìn)的,包括它的hash計(jì)算(好多的乘法運(yùn)算。。。完全沒(méi)必要以自己的生日作初始值,可以試著參考經(jīng)典高效的hash算法嘛),據(jù)某文章說(shuō)該作者還比較自戀的,曾經(jīng)在sourceforge的主頁(yè)上設(shè)置隨機(jī)的<title>,每句都是“最xxx,頂級(jí)xxx。。。”類似的含義。


對(duì)了還有一次疑或bucket array的長(zhǎng)度是否在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)就確定下來(lái)了的?
2010-02-01 23:22 | hightman

# re: tokyocabinet1.4.19閱讀筆記(二)hash數(shù)據(jù)庫(kù)查找key流程  回復(fù)  更多評(píng)論   

你看的是tc哪個(gè)版本?
我看的是tokyocabinet-1.4.45,tcutil.c中hash鏈的實(shí)現(xiàn),作者使用的是平衡樹(shù)啊,splay-tree伸展樹(shù)
2011-03-15 17:43 | wtommy

# re: tokyocabinet1.4.19閱讀筆記(二)hash數(shù)據(jù)庫(kù)查找key流程  回復(fù)  更多評(píng)論   

您這個(gè)就是說(shuō),在 key 1 有重復(fù)值。這個(gè)需要您進(jìn)去數(shù)據(jù)庫(kù)把之前的記錄給刪除,要不就在新的記錄改一下 key 1。<a href=http://www.mbtshoe-sales.com/>mbt outlet</a>
2011-03-29 13:37 | key 1
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性视频1819p久久| 亚洲国产高清一区| 欧美一区二区国产| 亚洲欧美日韩精品久久| 亚洲伊人一本大道中文字幕| 亚洲免费电影在线观看| 日韩午夜电影在线观看| 亚洲乱码国产乱码精品精天堂| 亚洲日本久久| aa国产精品| 亚洲午夜av| 欧美在线播放| 美女视频黄免费的久久| 欧美精品一区二区三区在线播放| 欧美激情精品久久久久久免费印度| 欧美日韩精品久久| 国产日韩精品视频一区| 亚洲欧洲一区二区在线播放 | 国产精品网站在线观看| 国产亚洲成av人在线观看导航| 激情欧美一区二区三区| 91久久精品一区| 亚洲欧美另类久久久精品2019| 久久久亚洲人| 亚洲精品1区| 国产精品萝li| 久久gogo国模啪啪人体图| 国产一区二区三区黄| 亚洲福利精品| 午夜国产精品视频免费体验区| 久久精品人人做人人综合| 欧美韩日精品| 午夜欧美大尺度福利影院在线看| 久久一区二区精品| 国产精品日本一区二区| 亚洲日本va午夜在线电影| 欧美一区二区在线| 亚洲第一久久影院| 欧美一区二区高清| 国产精品成人aaaaa网站| 在线精品在线| 欧美在线资源| 亚洲一区二区三区精品视频| 免费观看在线综合色| 激情综合亚洲| 欧美在线免费一级片| 亚洲美女中文字幕| 麻豆成人综合网| 国产综合久久久久久鬼色| 亚洲小说春色综合另类电影| 欧美护士18xxxxhd| 久久亚洲高清| 亚洲国产女人aaa毛片在线| 久久久夜夜夜| 欧美在线免费观看视频| 国产一区二区三区久久 | 在线免费观看欧美| 久久久精品动漫| 午夜在线a亚洲v天堂网2018| 欧美午夜精品| 亚洲欧美一级二级三级| 一区二区三区四区国产| 国产精品海角社区在线观看| 一区二区三区福利| 99re热这里只有精品免费视频| 欧美国产精品中文字幕| 亚洲日本aⅴ片在线观看香蕉| 噜噜噜噜噜久久久久久91 | av成人天堂| 亚洲美女黄色| 国产精品久久999| 欧美一区二区视频在线观看| 欧美一级网站| 伊人精品成人久久综合软件| 免费成人av在线看| 欧美a级在线| 99视频精品全国免费| 一二美女精品欧洲| 欧美中文日韩| 亚洲一区二区三区午夜| av不卡免费看| 国产精品扒开腿爽爽爽视频 | 欧美午夜精品久久久久久孕妇| 亚洲卡通欧美制服中文| 一区二区三区产品免费精品久久75 | 亚洲电影专区| 亚洲毛片av| 国产美女精品人人做人人爽| 久久先锋资源| 欧美日韩精品欧美日韩精品 | 亚洲人午夜精品免费| 一区二区三区久久精品| 国产一区二区| 亚洲啪啪91| 国产亚洲午夜| 日韩视频中文字幕| 国产欧美日韩在线| 欧美成人免费播放| 国产精品美女久久久久久免费| 久久人人爽国产| 欧美午夜大胆人体| 免费成人美女女| 国产精品久久久久久久app| 久久亚洲一区| 国产精品国产三级国产aⅴ入口| 久久国产精品一区二区三区四区 | 国产精品家庭影院| 蜜臀va亚洲va欧美va天堂| 欧美日韩国产美| 麻豆国产精品va在线观看不卡| 欧美日韩一区二区三区在线| 狂野欧美激情性xxxx欧美| 欧美日韩一区二区在线| 欧美69视频| 国产一区二区日韩精品欧美精品| 亚洲国产三级| 国内精品久久久久影院薰衣草| 这里只有精品视频| 99热免费精品在线观看| 先锋资源久久| 亚洲免费视频网站| 欧美日韩a区| 亚洲高清视频中文字幕| 国产综合久久久久久| 亚洲一区二区视频在线| 在线一区免费观看| 欧美高清视频在线| 欧美激情第二页| 激情欧美日韩| 久久精品亚洲一区| 久久久久久久久久久久久9999| 国产精品成人一区二区艾草| 国产精品中文字幕在线观看| 亚洲国产婷婷香蕉久久久久久| 欧美视频日韩| 亚洲精品国产精品国自产在线 | 欧美成人高清视频| 欧美成人免费全部观看天天性色| 国产日韩精品入口| 午夜精品视频在线| 久久aⅴ乱码一区二区三区| 国产精品久久| 亚洲综合国产| 午夜在线a亚洲v天堂网2018| 国产精品视频免费观看| 亚洲一区二区在线视频| 欧美专区亚洲专区| 一区二区在线观看av| 久久久国产成人精品| 乱人伦精品视频在线观看| 亚洲第一在线| 欧美日韩国产色视频| 99人久久精品视频最新地址| 一区二区三区黄色| 国产精品视频久久| 久久九九99| 91久久精品一区二区别| 亚洲视频中文字幕| 国产麻豆精品theporn| 欧美在线观看一区二区| 女人色偷偷aa久久天堂| 99国内精品久久久久久久软件| 欧美三级小说| 午夜精品久久久久久久99黑人| 久久久久国产精品一区| 亚洲美女在线看| 国产精品视频xxxx| 久久麻豆一区二区| 亚洲激情二区| 久久国产精品第一页| 亚洲经典在线看| 国产精品入口福利| 久久视频国产精品免费视频在线| 亚洲人成在线播放| 久久免费视频网| 99视频精品| 今天的高清视频免费播放成人| 欧美韩日高清| 欧美资源在线观看| 亚洲老板91色精品久久| 久久免费视频一区| 亚洲一区二区三区四区视频| 伊人成人网在线看| 国产精品区一区二区三| 免费观看在线综合| 欧美在线精品一区| 日韩亚洲综合在线| 欧美成人午夜免费视在线看片| 国产精品99久久久久久久久久久久| 国产综合视频| 国产精品海角社区在线观看| 久久夜色精品国产亚洲aⅴ| 亚洲一区二区三区在线| 亚洲国产一区二区三区a毛片| 久久久www成人免费毛片麻豆| 99re成人精品视频| 亚洲国产精品久久久久秋霞影院| 国产精品一区一区三区| 欧美手机在线| 欧美日韩亚洲一区二|