levelDB的学习

学习资料

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,"import leveldb"是用于导入LevelDB的Python开发包,使得我们可以在代码中使用LevelDB的功能和方法。 当我们在代码中使用"import leveldb"时,我们可以通过创建一个LevelDB对象来打开一个数据库连接,从而可以对数据库进行读写操作。然而,如果我们尝试在已经打开的连接上再次打开连接,就会引发错误。这是因为LevelDB只允许一个进程同时持有一个数据库的锁定。如果数据库已经被其他进程锁定,就会出现"leveldb.LevelDBError: IO error: lock /var/tmp/ldb1.ldb/LOCK: already held by process"的错误提示。 此外,LevelDB还提供了一些API用法。在使用LevelDB之前,我们可以包装相关的import语句和Options对象来打开和关闭数据库连接,以及其他操作。具体的API用法可以参考LevelDB的官方文档或相关教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [LevelDB的Python开发包 py-leveldb基本使用方法的代码](https://blog.csdn.net/weixin_43896490/article/details/121946555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [leveldb 的部署和使用](https://blog.csdn.net/Moolight_shadow/article/details/119276763)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [leveldb:LevelDB到Java的端口](https://download.csdn.net/download/weixin_42098892/18545599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值