其他
谷歌这个开源的数据库真牛逼,竟然还上Github热榜~
大家好,我是D哥
点击关注下方公众号,Java面试资料 都在这里
来源:https://github.com/google/leveldb/
key和value可以是字符串或者字节流
数据按key排列,有序存储
调用方可以重载排序方法,以实现自定义排序
基本操作只有3种:Put(key, value)、Get(key)、Delete(key)
提供原子批量修改接口
支持数据快照
支持向前和向后的迭代器
支持数据自动压缩,使用的是snappy压缩算法
和操作系统之间的外部交互是通过虚接口(virtual interface)来进行,这样用户就能定制化这些交互了
这不是一个 SQL 数据库,它没有关系数据模型,不支持 SQL 查询,也不支持索引。
同时只能有一个进程(可能是具有多线程的进程)访问一个特定的数据库。
该程序库没有内置的 client-server 支持,有需要的用户必须自己封装。
#include <cassert>
#include "leveldb/db.h"
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
...
options.error_if_exists = true;
... open the db as described above ...
... do something with db ...
delete db;
std::string value;
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
if (s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value);
if (s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);
并发
一个数据库同时只能被一个进程打开。leveldb 会从操作系统获取一把锁来防止多进程同时打开同一个数据库。在单个进程中,同一个 leveldb::DB 对象可以被多个并发线程安全地使用,也就是说,不同的线程可以在不需要任何外部同步原语的情况下,写入、获取迭代器或者调用 Get(leveldb 实现会确保所需的同步)。但是其它对象,比如 Iterator 或者 WriteBatch 需要外部自己提供同步保证,如果两个线程共享此类对象,需要使用自己的锁进行互斥访问。具体见对应的头文件。
扫描下方二维码,回复关键字【 java】