Berkeley DB (BDB) 是 Oracle 旗下高性能嵌入式鍵值存儲引擎,廣泛應用於需要本地持久化存儲的場景。本文從安裝部署到核心API操作,提供完整的入門指南。
# 官網下載:https://www.oracle.com/database/technologies/berkeleydb-downloads.html
wget https://download.oracle.com/berkeley-db/db-6.0.20.tar.gz
tar -xzf db-6.0.20.tar.gz
cd db-6.0.20/build_unix
../dist/configure --prefix=/opt/bdb
make && make install
export BDB_HOME=/opt/bdb
export LD_LIBRARY_PATH=$BDB_HOME/lib:$LD_LIBRARY_PATH
export PATH=$BDB_HOME/bin:$PATH
g++ -o test test.cpp -I$BDB_HOME/include -L$BDB_HOME/lib -ldb -lpthread
db_create() 創建DBT 結構,支援任意二進制數據DB* dbp;
int ret = db_create(&dbp, NULL, 0);
if (ret != 0) { /* 錯誤處理 */ }
ret = dbp->open(dbp, NULL, "demo.db", NULL, DB_BTREE, DB_CREATE, 0664);
if (ret != 0) {
dbp->err(dbp, ret, "無法打開數據庫");
exit(1);
}
關鍵參數:DB_BTREE 選擇 B+樹存取,DB_CREATE 表示不存在時創建。
DBT key, data;
char* keyStr = "username";
char* valStr = "zhangsan";
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = keyStr;
key.size = strlen(keyStr) + 1; // 包含結束符
data.data = valStr;
data.size = strlen(valStr) + 1;
// 覆蓋模式(默認)
ret = dbp->put(dbp, NULL, &key, &data, 0);
// 防覆蓋模式
// ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE);
memset(&data, 0, sizeof(data));
ret = dbp->get(dbp, NULL, &key, &data, 0);
if (ret == 0) {
printf("查詢成功: %s\n", (char*)data.data);
} else if (ret == DB_NOTFOUND) {
printf("鍵不存在\n");
} else {
dbp->err(dbp, ret, "查詢失敗");
}
ret = dbp->del(dbp, NULL, &key, 0);
if (ret == 0) printf("刪除成功\n");
else if (ret == DB_NOTFOUND) printf("鍵不存在,無法刪除\n");
dbp->close(dbp, 0); // 確保緩衝區刷新到磁盤,資源釋放
// 運行期強制落盤(BDB 4.3+ 版本)
dbp->sync(dbp, 0);
BDB 原生不支援 SQL 風格的多索引,需應用層維護:
| 參數 | 建議值 | 說明 |
|---|---|---|
| Cache Size | 物理記憶體 25%-50% | set_cachesize(),減少磁盤 I/O |
| Page Size | 4KB-64KB | 根據記錄大小調整,影響 Btree 高度 |
| Transaction | 按需啟用 | 事務帶來額外開銷,唯讀場景可關閉 |
| Sync Policy | DB_TXN_NOSYNC | 高吞吐場景犧牲耐久性換性能 |
Berkeley DB 以輕量級、高性能、無需獨立進程的特點,成為嵌入式存儲首選。掌握其核心 API(open/put/get/del/close)與存取方法選擇(Btree/Hash),配合合理的緩存與頁面配置,即可構建高可靠的本地存儲方案。進階學習方向包括:事務處理、複製集群、二級索引設計、從 SQL 遷移到 NoSQL 的建模差異等。