Kyoto Cabinet是一个数据库管理的库,是TokyoCabinet的改进版本。数据库是一个简单的包含记录的数据文件,每个记录是一个键值对(Key/Value),Key和Value都是变长的字节序列。Key和 Value既可以是二进制的,也可以是文本字符串。数据库中的Key必须唯一。数据库既没有表的概念,也不存在数据类型。所有的记录被组织为Hash表或 B+树。
在数据库中,可以储存Key-Value记录,也可以根据Key来获取和删除记录。还可以遍历访问所有的Key。这些方法类似于UNIX标准中的DBM库(及后来的NDBM和GDBM)。因为KC的高性能,可以作为DBM的替代品。
Hash数据库的每个操作的时间复杂度是 O(1),因此理论上,性能是常量,而与数据库的规模无关。在实践中,性能由内存或存储设备的速度决定。如果数据库的大小小于内存大小,性能表现为内存的速度,比STL中的std::map要快。当然数据库大小可以大于内存大小,最大上限是8EB(1024×1024×1024GB)。即使在这样的情况下,每个操作也只需要一两个存储设备的seek操作。
B+ Tree 数据库的每个操作的时间复杂度是 O(log N)。因此理论上,性能是数据库规模的对数。尽管B+ Tree数据库的随机访问性能要慢于Hash数据库,但B+ tree数据库支持对Key 顺序的连续访问,这可以实现对字符串的前向匹配查找和整数的范围查找。连续访问的性能远快于随机访问。
API是基于面向对象设计的,Hash数据库和B+ Tree数据库都有从同一个超类继承而来的同样的方法。除了他们,还有7种数据库也继承了同样的超类。Prototype Hash数据库采用标准容器 std::unordered_map 实现,Prototype Tree 数据库采用标准容器std::map 实现,Stash 数据库是采用Naive Hash Map的原始实现来节省内存,Cache Hash 数据库是采用 LRU删除算法的双向链接Hash Map 原始实现。Cache Tree 数据库是基于Cache Hash 数据库并提供B+ Tree的机制。Directory hash 数据库是采用文件系统的目录机制实现,每个记录存储为一个目录下的文件。Directory Tree 数据库基于Directory hash数据库并提供B+ Tree的机制。所有的数据库都有相关的事物(Transaction)和游标(Cursor)的实用方法。软件也包含了命令行接口的程序。
KC的运行速度非常快。例如,保存一百万记录到Hash数据库中只需要0.9秒,保存到B+ Tree数据库只需要1.1秒。而且数据库本身还非常小。例如,Hash数据库的每个记录头只有16字节,B+ Tree数据库是4字节。更进一步,KC的伸缩性非常大,数据库大小可以增长到8EB(9.22e18 Bytes)。
KC是C++语言编写的,并提供C++、C、Java、Python、Ruby、Perl 和 Lua 的API。KC可以用在所有符合 C++03标准并带TR1库扩展的平台。KC是GNU General Public License的自由软件。FOSS License例外也提供用来适应其它免费和开源的licenses。另一方面也提供商业license。如果你在专有软件中使用KC,那么你需要商业 license。
KC(KyotoCabinet)是TC(Tokyo Cabinet)的C++升级实现,而且更新比较频繁。如果是纯Key-Value存储的话,KC是一个很好的选择。KT(Kyoto Tycoon)是KC的一个网络接口。
Kyoto Cabinet的官方项目网址为:http://fallabs.com/kyotocabinet。
当前最新版本为1.2.76(kyotocabinet-1.2.76.tar.gz),下载地址为:
http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.76.tar.gz
Linux下环境要求:Linux2.6+、gcc 4.2+、GNU make和ZLIB1.2.3+。
1) 查看内核版本:uname -r
2.6.18-194.el5
2) 查看GCC版本:gcc -v
gcc 版本 4.1.2 20080704 (Red Hat 4.1.2-48)
3) 查看ZLIB版本:rpm -qa |grep zlib
zlib-1.2.3-3
4) 查看make的版本:make -v
GNU Make 3.81
Linux下编译和安装KC非常简单,步骤如下:
1) 下载源代码包
# wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.76.tar.gz
2) 解压缩源码包
# tar zxvf kyotocabinet-1.2.76.tar.gz
3) 配置和编译
#./configure && make
4) 执行自检测试
#make check
5) 安装库
#sudo make install
安装完成后,KC头文件存放在/usr/local/include目录中,KC库文件存放在/usr/local/lib中,KC执行文件位于/usr/local/bin目录中。
生成libkyotocabinet.a/libkyotocabinet.so的静态和动态库。
注1:KC要求gcc 4.2以后的版本,但是KC1.2.76版本也可以在RHEL 5.5 x64(gcc 4.1.2)下编译通过。
Windows下环境要求:VS 2008SP1(或者)VS 2010、nmake。
Windows下编译和安装KC,步骤如下:
1) 解压源代码到本地硬盘上
假设源代码所在目录为H:\kyotocabinet-1.2.76。
2) 补充stdint.h头文件
从https://code.google.com/p/msinttypes/网址下载,把stdint.h文件解压到H:\kyotocabinet-1.2.76。
3) 修改KC源代码正确使用STL库
由于std空间中的unordered_map、hash、regex、smatch等都在std::tr1的空间中。
修改1:打开kccommon.h文件,找到第95行的代码,如下:
namespace std {
using tr1::hash;
using tr1::unordered_map;
using tr1::unordered_set;
}
把上面代码移动(剪切/粘贴)到#endif之后的位置,保存文件。
修改2:打开kcregex.cc文件,找到第25行,在#endif前面添加下面几行代码:
namespace std {
using tr1::regex;
using tr1::smatch;
using tr1::regex_search;
using tr1::regex_replace;
}
修改完毕后保存文件。
4) 修改VCmakefile文件
根据VS(2008 SP1)的VC++的目录修改VCMakefile文件第11行,如下:
VCPATH = D:\Program Files\Microsoft Visual Studio 9.0\VC
SDKPATH = C:\Program Files\Microsoft SDKs\Windows\v6.0A
根据运行时使用库的类型修改VCMakefile文件:
a) 多线程动态库Release版本,修改为如下:
/DNDEBUG/D_CRT_SECURE_NO_WARNINGS \
/O2 /EHsc /W3 /wd4244 /wd4351 /wd4800 /MD
b) 多线程动态库Debug版本,修改为如下:
/D_DEBUG /D_CRT_SECURE_NO_WARNINGS \
/O2 /EHsc /W3/wd4244 /wd4351 /wd4800 /MDd
提示: 缺省情况下,使用/MT链接到LIBCMT.LIB库上进行编译,如果希望使用MSVCRT.LIB,使用/MD选项进行重新编译。如果你的环境是64位版本,增加“/D_SYS_WIN64_”选项来改进性能。
注:应用程序和动态库使用的运行时库必须一致,否则会产生链接错误。
5) 清除和重新编译KC
从“Visual Studio 2008 Command Prompt”快捷方式中进入DOS命令行窗口。
# h:
# cd kyotocabinet-1.2.76
# nmake /f VCmakefileclean
# nmake /f VCmakefile
注:使用/MD和/MDd选项都生成名为libkyotocabinet.lib的库,需要自己修改名称。
6) 执行自检测试
# nmake /f VCmakefile check
7) 生成打包目录
# nmake -f VCmakefile binpkg
在源代码目录下生成kcwin32目录,其中包括include/bin/doc/lib四个目录,可以进行打包发布使用。
注0:如果需要生成/MD和/MDd的静态库,那么需要修改VCmakefile重新编译。
注1:在安装VS 2008 SP1补丁的VS 2008上成功编译KC库。
注2:参考网址http://fallabs.com/kyotocabinet/spex.html#features。
示例代码请参考源代码目录中的example子目录,其中包含各种形式数据库的例子程序。
注1:需要关闭告警信息包括4244;4996;4351。