NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据。Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列。最近使用BDB来发一个KV系统,并将这段时间的BDB的学习和使用经验记录如下。(项目中使用了BDB的4.8.30版本,本文所有涉及的具体问题都基于该版本)。
1. Berkeley DB的简介
Berkeley DB(BDB)是一个高性能的嵌入式数据库编程库(引擎),它可以用来保存任意类型的键/值对 (Key/Value Pair),而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据。
BDB提供诸如C语言,C++,Java,Perl,Python,Tcl等多种编程语言的API,并且广泛支持大多数类Unix操作系统和Windows操作系统以及实时操作系统(如 VxWorks)。
1991年,Berkeley DB的第一个版发行(Linux系统也在这一年诞生),其最初的开发目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现,该版本还包含了B+树数据访问算法。
1992年,BSD UNIX第4.4发行版中包含了Berkeley DB1.85版。基本上认为这是Berkeley DB的第一个正式版。
1996年,Sleepycat软件公司成立,提供对Berkeley DB的商业支持。
2006年,Sleepycat被Oracle收购,当时最新版本是4.7.25。
以上来自:http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html
下面说一下实战吧:
1. 安装
http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
下载并解压。
cd db-xxx cd build_unix ./dist/configure --prefix=/home/work/opt/berkeleydb --enable-cxx #其中 --enable-cxx来启动编译c++的相关选项,如果没有enable那么编译出的就不能使用berkeley db c++对应的接口。 之后: make make install
添加对应的环境变量:
C_INCLUDE_PATH=your_dir:$C_INCLUDE_PATH
CPLUS_INCLUDE_PATH=your_dir:$CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH=your_dir:$LD_LIBRARY_PATH
LD_RUN_PATH=your_dir:$LD_RUN_PATH
2. 测试:
#include <iostream> #include <stdio.h> #include <db_cxx.h> #define DATABASE "test.db" using namespace std; int main() { u_int32_t flag = DB_CREATE; Db db(NULL, 0); try { db.open(NULL, DATABASE, NULL, DB_BTREE, flag, 0); } catch (std::exception &e) { printf("std eception happens\n"); return 2; } Dbt key, data; for (int i = 0; i < 100; ++i) { Dbt key(&i, sizeof(int)); Dbt data(&i, sizeof(int)); db.put(0, &key, &data, DB_NOOVERWRITE); } Dbc *dbcp, *dbcp1; db.cursor(NULL, &dbcp, 0); while(dbcp->get(&key, &data, DB_NEXT) == 0 ) { printf("key:%d#value:%d\n",*((int*)key.get_data()), *((int*)data.get_data())); } dbcp->close(); db.sync(0); try { db.close(0); } catch (std::exception &e) { printf("when clsoe std exception happens\n"); } printf("yes\n"); return 0; }
编译: g++ test_bdb.cpp -ldb_cxx
./a.tout