google/leveldb
GitHub: google/leveldb
LevelDB 是一个高效的嵌入式键值存储库,提供有序的字符串键到字符串值映射。
Stars: 38973 | Forks: 8184
LevelDB 是 Google 编写的一个快速的键值存储库,它提供了从字符串键到字符串值的有序映射。
[](https://github.com/google/leveldb/actions/workflows/build.yml)
作者:Sanjay Ghemawat (sanjay@google.com) 和 Jeff Dean (jeff@google.com)
# 功能特性
* 键和值是任意的字节数组。
* 数据按键排序存储。
* 调用者可以提供自定义的比较函数来覆盖排序顺序。
* 基本操作包括 `Put(key,value)`、`Get(key)`、`Delete(key)`。
* 可以在一个原子批处理中进行多次修改。
* 用户可以创建一个临时快照,以获取数据的一致视图。
* 支持正向和反向遍历数据。
* 数据自动使用 [Snappy 压缩库](https://google.github.io/snappy/) 进行压缩,但也支持 [Zstd 压缩](https://facebook.github.io/zstd/)。
* 外部活动(文件系统操作等)通过虚拟接口传递,因此用户可以自定义操作系统交互。
# 文档
[LevelDB 库文档](https://github.com/google/leveldb/blob/main/doc/index.md) 在线提供,并随源代码一起打包。
# 限制
* 这不是一个 SQL 数据库。它没有关系数据模型,不支持 SQL 查询,也不支持索引。
* 同一时刻只有一个进程(可能是多线程的)可以访问特定的数据库。
* 库内部没有客户端-服务器支持。需要此类支持的应用必须围绕该库自行封装服务器。
# 获取源码
```
git clone --recurse-submodules https://github.com/google/leveldb.git
```
# 构建
该项目开箱即用地支持 [CMake](https://cmake.org/)。
### 为 POSIX 系统构建
快速开始:
```
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
```
### 构建 Windows 版本
首先生成 Visual Studio 2017 项目/解决方案文件:
```
mkdir build
cd build
cmake -G "Visual Studio 15" ..
```
默认构建针对 x86。要构建 64 位版本,请运行:
```
cmake -G "Visual Studio 15 Win64" ..
```
要从命令行编译 Windows 解决方案:
```
devenv /build Debug leveldb.sln
```
或者在 Visual Studio 中打开 leveldb.sln 并进行构建。
请参阅 CMake 文档和 `CMakeLists.txt` 以获取更高级的用法。
# 贡献给 leveldb 项目
leveldb 项目欢迎贡献。leveldb 的主要目标是成为一个
可靠且快速的键值存储。更符合
上述功能/限制特征,并满足以下要求
的更改将被考虑。
贡献要求:
1. **仅测试过的平台**。我们 _通常_ 只接受为
已编译和测试的平台所做的更改。这意味着 POSIX(适用于 Linux 和
macOS)或 Windows。非常小的更改有时会被接受,但
这更多是例外而非规则。
2. **稳定的 API**。我们非常努力地维护稳定的 API。更改
需要修改使用 leveldb 的项目 _可能_ 会被拒绝,除非对项目有足够的好处。
3. **测试**:所有更改必须附带新的(或修改的)测试,或
提供充分说明为何不需要新的(或修改的)测试。
4. **一致的代码风格**:该项目遵循
[Google C++ 风格指南](https://google.github.io/styleguide/cppguide.html)。
为确保您的更改格式正确,请运行:
clang-format -i --style=file
我们不太可能接受对构建配置文件的更改,例如
`CMakeLists.txt`。我们专注于维护一个构建配置,
允许我们在 Google 内部的一些支持配置中测试项目是否正常工作。
我们目前没有兴趣支持其他需求,例如不同的操作系统、编译器或构建系统。
## 提交拉取请求
在合并任何拉取请求之前,作者必须首先在
https://cla.developers.google.com/ 签署
贡献者许可协议 (CLA)。
为了保持提交历史的线性
[squash](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Squashing-Commits)
您的更改到一个提交并 [rebase](https://git-scm.com/docs/git-rebase)
到 google/leveldb/main。这保持提交历史线性并且更容易同步
与 Google 内部仓库。更多细节请参考 GitHub 的
[关于 Git rebase](https://help.github.com/articles/about-git-rebase/) 页面。
# 性能
以下是运行内置的 db_bench 程序的性能报告(附带解释)。结果有些噪声,但应该足以大致估算性能。
## 环境设置
我们使用一个包含一百万条记录的数据库。每条记录有一个 16 字节的键和一个 100 字节的值。基准测试使用的值压缩后大约为原始大小的一半。
```
LevelDB: version 1.1
Date: Sun May 1 12:11:26 2011
CPU: 4 x Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
CPUCache: 4096 KB
Keys: 16 bytes each
Values: 100 bytes each (50 bytes after compression)
Entries: 1000000
Raw Size: 110.6 MB (estimated)
File Size: 62.9 MB (estimated)
```
## 写入性能
“fill” 基准测试会创建一个全新的数据库,顺序或随机写入。“fillsync” 基准测试会在每次操作后将数据从操作系统刷新到磁盘;其他写入操作会将数据保留在操作系统缓冲区缓存中一段时间。“overwrite” 基准测试会对现有键进行随机更新。
```
fillseq : 1.765 micros/op; 62.7 MB/s
fillsync : 268.409 micros/op; 0.4 MB/s (10000 ops)
fillrandom : 2.460 micros/op; 45.0 MB/s
overwrite : 2.380 micros/op; 46.5 MB/s
```
以上每条 “op” 对应一次单个键值对的写入。
也就是说,一个随机写入基准测试大约以每秒 400,000 次写入的速度运行。
每次 “fillsync” 操作的开销要小得多(0.3 毫秒)
比磁盘寻道(通常为 10 毫秒)要低。我们怀疑这是因为硬盘本身在其内存中缓冲了更新,并在数据写入磁盘之前作出响应。这可能是安全的,也可能不安全,取决于硬盘是否有足够的电量在断电时保存其内存。
## 读取性能
我们列出了正向和反向顺序读取的性能,以及随机查找的性能。
请注意,基准测试创建的数据库非常小。
因此,该报告描述了 leveldb 在工作集完全驻留在内存中的情况下的性能。读取不在操作系统缓冲区缓存中的数据所花费的成本将主要由获取数据所需的一两次磁盘寻道决定。
写入性能基本不受工作集是否驻留在内存中的影响。
```
readrandom : 16.677 micros/op; (approximately 60,000 reads per second)
readseq : 0.476 micros/op; 232.3 MB/s
readreverse : 0.724 micros/op; 152.9 MB/s
```
LevelDB 在后台压缩其底层存储数据以提高读取性能。以上列出的结果是在大量随机写入后立即生成的。压缩完成后(通常会自动触发)的结果会更好。
部分读取的高成本来自于对从磁盘读取的数据块进行重复解压缩。如果为 leveldb 提供足够的缓存,使其能够在内存中保存未压缩的数据块,读取性能将再次提升:
```
readrandom : 11.602 micros/op; (approximately 85,000 reads per second)
readseq : 0.423 micros/op; 261.8 MB/s
readreverse : 0.663 micros/op; 166.9 MB/s
```
## 仓库内容
请参阅 [doc/index.md](doc/index.md) 获取更多说明。请参考
[doc/impl.md](doc/impl.md) 了解实现的简要概述。
公共接口位于 include/leveldb/*.h。调用者不应包含或
依赖该软件包中任何其他头文件的细节。这些
内部 API 可能会在未通知的情况下更改。
头文件指南:
* **include/leveldb/db.h**:与数据库交互的主要接口:从这里开始。
* **include/leveldb/options.h**:控制整个数据库的行为,
以及单个读写操作的行为。
* **include/leveldb/comparator.h**:用户指定比较函数的抽象。
如果您只想按字节比较键,可以使用默认
比较器,但客户端可以编写自己的比较器实现以支持自定义排序
(例如处理不同的字符编码等)。
* **include/leveldb/iterator.h**:用于遍历数据的接口。您可以从 DB
对象获取迭代器。
* **include/leveldb/write_batch.h**:用于原子应用多个
更新到数据库的接口。
* **include/leveldb/slice.h**:一个简单的模块,用于维护指向
某个字节数组的指针和长度。
* **include/leveldb/status.h**:许多公共接口返回状态,
用于报告成功和各种错误。
* **include/leveldb/env.h**:
操作系统环境的抽象。POSIX 实现位于 util/env_posix.cc。
* **include/leveldb/table.h, include/leveldb/table_builder.h**:低级模块,
大多数客户端可能不会直接使用。
标签:Bash脚本, C++, CMake, Google, LevelDB, Nuclei, Snappy压缩, Zstd压缩, 原子批处理, 字符串值, 字符串键, 存储引擎, 嵌入式数据库, 快照, 快速存储, 排序存储, 数据库, 数据擦除, 文件系统操作, 有序映射, 虚拟接口, 迭代器, 键值存储