当前位置: 首页 > 工具软件 > LevelDB.NET > 使用案例 >

levelDB的学习

莫英卓
2023-12-01

学习资料

(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.编译

1.1 linux下编译

<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

2.数据库文件介绍

学习这篇文章:

[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文件。

3.为什么用Slice

 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;
}

 类似资料: