学习资料
(3条消息) leveldb kv数据库可视化操作小工具(增删查改)_melon-gaga的博客-CSDN博客_leveldb 可视化
(3条消息) 半小时学会LevelDB原理及应用_紫魔戒-CSDN博客_leveldb
leveldb常见问题以及性能优化点_程序员的世界-CSDN博客_leveldb 调优
LevelDB C API 整理分类
https://www.cnblogs.com/pandang/p/7279306.html
下载源代码地址:
github的官网地址
https://github.com/google/leveldb/releases
<1>下载最新版本: leveldb-1.23.tar.gz
<2>查看readme.md文档,里面有相关的编译介绍,进行编译,操作如下:
解压 压缩包: tar zxf leveldb-1.23.tar.gz
mkdir -p build
cd build
编译成静态库: cmake -DCMAKE_BUILD_TYPE=Release ..
编译成动态库:cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON ..
cmake --build . 或者 make -j4
<3>出现错误,主要是没有第三方的文件,修改CMakeLists.txt的34行,如下:
option(LEVELDB_BUILD_TESTS "Build LevelDB's unit tests" OFF)
option(LEVELDB_BUILD_BENCHMARKS "Build LevelDB's benchmarks" OFF)
option(LEVELDB_INSTALL "Install LevelDB's header and library" OFF)
<4>注释掉: 生成.so .so.1.23 后缀,仅生成.so,便于管理
# set_target_properties(leveldb
# PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})
<5>拷贝include/leveldb/*.h的头文件和build文件夹下的 libleveldb.so
学习这篇文章:
[LevelDB] 存储1:一目了然 —— 数据库包含哪些文件
https://zhuanlan.zhihu.com/p/234360222
000004.log: 是WAL文件,写入的键值对,都会先写到这个日志文件中;
000005.ldb: 是SSTable文件,存储了持久化到磁盘的键值对;
LOCK : 文件是锁文件,一个LevelDB数据库同时只允许被一个进程操作,一个进程打开一个数据库时,会对这个文件加锁,防止其它进程并发打开这个数据库;
LOG :是通用日志文件,在里面打印一些系统运行的信息;
MANIFEST-000002:
是资源文件,记录了版本信息,LevelDB有一系列的ldb文件,各个文件在不同的Level,而资源文件记录了当前各个文件在哪一层,下一个待分配的文件编号是什么等信息;
CURRENT :在进行一次Compaction后,生成新的版本信息,会将变化写入到MANIFEST文件中,如果MANIFEST太大,下次打开时会重写MANIFEST文件,会新增一个MANIFEST,而CURRENT则保存了当前使用的MANIFEST文件,是为了安全地重写MANIFEST文件。
LevelDB源码分析:理解Slice实现 - 高效的LevelDB参数对象
https://blog.csdn.net/jinguangliu/article/details/84997684
1.Slice对象仅包含长度和字符指针类型的成员,对象的复制非常高效,但也非常危险
2.作用: 二进制数据可以像字符串一样存储也就是说任何数据结构体都可以像字符串一样存储
代码例子:
#include <stdio.h>
#include <unistd.h>
#include <memory>
#include <csignal>
#include <iostream>
#include <cassert>
#include "leveldb/db.h"
struct binValues
{
int intVal;
double realVal;
};
//leveldb::Slice作用:任何数据结构都像string一样操作
//结构体数据像string一样put和get
int test_slice(leveldb::DB *db)
{
leveldb::Status s;
binValues b = {-99, 3.14};
leveldb::Slice binSlice((const char *)&b, sizeof(binValues));
s = db->Put(leveldb::WriteOptions(), "BinSample", binSlice);
assert(s.ok());
std::string binRead;
s = db->Get(leveldb::ReadOptions(), "BinSample", &binRead);
if (s.ok())
{
// treat the std::string as a container for arbitary binary data
binValues *b2 = (binValues *)binRead.data();
std::cout << "Read back binary structure " << b2->intVal << " "
<< b2->realVal << " binary size=" << binRead.size() << std::endl;
}
return 0;
}
int test_leveldb()
{
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "./testdb", &db);
assert(status.ok());
std::cout << "leveldb open success!" << std::endl;
std::string value;
std::string key1 = "testkey1";
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
if (s.IsNotFound())
{
std::cout << "can not found for key:" << key1 << std::endl;
db->Put(leveldb::WriteOptions(), key1, "testvalue1");
}
s = db->Get(leveldb::ReadOptions(), key1, &value);
if (s.ok())
{
std::cout << "found key:" << key1 << ",value:" << value << std::endl;
}
s = db->Delete(leveldb::WriteOptions(), key1);
if (s.ok())
{
std::cout << "delete key success which key:" << key1 << std::endl;
}
s = db->Get(leveldb::ReadOptions(), key1, &value);
if (s.IsNotFound())
{
std::cout << "can not found after delete for key:" << key1 << std::endl;
}
//
leveldb::WriteOptions writeOptions;
std::string strParam = "strParam";
std::string strKey = "strKey";
leveldb::Slice licKey(strKey);
leveldb::Slice licValue(strParam);
db->Put(writeOptions, licKey, licValue);
s = db->Get(leveldb::ReadOptions(), licKey, &value);
if (s.ok())
{
std::cout << "found key:" << licKey.data() << ",value:" << value << std::endl;
}
test_slice(db);
delete db;
return 0;
}
//测试指令: ./
int main(int argc, char **argv)
{
test_leveldb();
return 0;
}