tokyo cabinet官方主页http://fallabs.com/tokyocabinet/,是一款kv型的数据库,没有数据类型,没有表的概念,key和value都可以是任意长度的字符串。
tokyo cabinet安装比较简单:
1. 下载源文件包:http://fallabs.com/tokyocabinet/tokyocabinet-1.4.47.tar.gz
2. 解压该文件:
tar zxvf tokyocabinet-1.4.47.tar.gz
3. 编译安装
cd tokyocabinet-1.4.47/
./configure ; make ; make install
上面及完成整个tokyo cabinet数据库的安装,tokyo cabinet的使用也非常简单,和通常意义上的数据库操作是类似的:
1. 首先打开数据库,得到和数据库操作的句柄
2. 使用该句柄执行操作
3. 释放该句柄
解压完的example目录中有多个示例程序,tcadbex.c是比较简单的一个,内容如下:
#include <tcutil.h> #include <tcadb.h> #include <stdlib.h> #include <stdbool.h> #include <stdint.h> int main(int argc, char **argv){ TCADB *adb; char *key, *value; /* create the object */ adb = tcadbnew(); /* open the database */ if(!tcadbopen(adb, "casket.tch")){ fprintf(stderr, "open error\n"); } /* store records */ if(!tcadbput2(adb, "foo", "hop") || !tcadbput2(adb, "bar", "step") || !tcadbput2(adb, "baz", "jump")){ fprintf(stderr, "put error\n"); } /* retrieve records */ value = tcadbget2(adb, "foo"); if(value){ printf("%s\n", value); free(value); } else { fprintf(stderr, "get error\n"); } /* traverse records */ tcadbiterinit(adb); while((key = tcadbiternext2(adb)) != NULL){ value = tcadbget2(adb, key); if(value){ printf("%s:%s\n", key, value); free(value); } free(key); } /* close the database */ if(!tcadbclose(adb)){ fprintf(stderr, "close error\n"); } /* delete the object */ tcadbdel(adb); return 0; }
上面的程序打开数据库,插入几条数据,之后查询插入的数据,释放资源。
tokyo cabinet中有多中数据存储方式,下面的博客中主要关注的是下面的两种存储方式HASH方式和B+树形式。如果是HASH形式的话,按照如下的形式组织:
给定key,之后,经过hash(key)得到对应的bucket,每个bucket使用二叉查找树的形式维护的是被hash到该bucket上的<key, value>。
如果是使用B+树的形式实现的话,组织形式如下:这种组织方式使用B+树的形式给key构建索引,查找的时间复杂度为O(logN),另外的一种好处是使用B+树的形式能够更加容易的支持范围查询。