摘要:首先也是对数据库进行读锁定,然后调用tchdbbidx获取hash和index,对index所对应的树写锁定。调用tchdbgetbucket获取offset后,就执行查找节点的流程(和前面一样)。找到后就调用tchdbremoverec从文件删除记录。Tchdbremoverec首先会把记录块作为空闲块回收,再去维护二叉树。 维护二叉树时可能就有4种情况:(1) 是叶子节点;(2) 仅有左子节点...
阅读全文
摘要:写入记录相对读取来说就复杂多了Tchdbput 接口来写入记录,首先对整个DB进行读锁定,调用tchdbbidx 来获取hash bucket index 和hash,然后对index对应的树进行写锁定,接着调用tchdbputimpl 进行记录写入。Tchdbputimpl 首先tchdbgetbucket获取首个节点的偏移,随后也是和读取记录相同的查找记录。如果能找到记录,根据处置方式处理记录...
阅读全文
摘要:tchdbget 首先对数据库读锁定,调用tchdbbidx 获取hash和bucket的index,这个算法分布是否均匀呢,没验证。看看代码吧:static uint64_t tchdbbidx(TCHDB *hdb, const char *kbuf, int ksiz, uint8_t *hp){ assert(hdb && kbuf && ksiz >...
阅读全文
摘要:看看tokyo cabinet 初始化的时候做了些什么事设置些参数(如rcnum,xmsize等)之后就可以调用tchdbopen来初始化HDB了,tchdbopen首先会对整个HDB对象进行写锁定,随后调用tchdbopenimpl进行真正初始化动作。Tchdbopenimpl首先对数据库文件用文件锁锁定,如果文件空就初始化文件,数据库文件的组织结构如下:Header(256字节)+Hash B...
阅读全文