社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

谷歌这个牛逼的开源数据库,我居然等到它上Github热榜才发现

开源最前线 • 3 年前 • 259 次点击  

开源最前线(ID:OpenSourceTop) 猿妹整编

链接:https://github.com/google/leveldb/


今天要和大家分享一个谷歌开源多年,但依旧扛打,最近还登上Github热榜的kv数据库——LevelDB。



Leveldb是一个google实现的非常高效的kv数据库,创建者是大名鼎鼎的 Jeff Dean 和 Sanjay Ghemawat,目前的版本1.2能够支持billion级别的数据量了。在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计。

LevelDB 是单进程的服务,性能非常之高,在一台4个Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。具有以下功能特性:
  • key和value可以是字符串或者字节流

  • 数据按key排列,有序存储

  • 调用方可以重载排序方法,以实现自定义排序

  • 基本操作只有3种:Put(key, value)、Get(key)、Delete(key)

  • 提供原子批量修改接口

  • 支持数据快照

  • 支持向前和向后的迭代器

  • 支持数据自动压缩,使用的是snappy压缩算法

  • 和操作系统之间的外部交互是通过虚接口(virtual interface)来进行,这样用户就能定制化这些交互了


levelDB特牛,但是,再好的工具也有它的局限性,LevelDB 的局限性也很明显:
  • 这不是一个 SQL 数据库,它没有关系数据模型,不支持 SQL 查询,也不支持索引。

  • 同时只能有一个进程(可能是具有多线程的进程)访问一个特定的数据库。

  • 该程序库没有内置的 client-server 支持,有需要的用户必须自己封装。



LevelDB的使用方法

打开数据库

leveldb数据库的名称与文件系统目录相对应。数据库的所有内容都存储在此目录中。以下示例显示了如何打开数据库:


#include 
#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());
...


如果要在数据库已经存在的情况下引发错误,请在leveldb::DB::Open调用之前添加以下行:


options


    
.error_if_exists = true;



关闭数据库

完成数据库操作后,只需删除数据库对象。例子:


... open the db as described above ...
... do something with db ...
delete db;



读写

数据库提供了Put,Delete和Get方法来修改/查询数据库。如下:


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 需要外部自己提供同步保证,如果两个线程共享此类对象,需要使用自己的锁进行互斥访问。具体见对应的头文件。



目前,leveldb已经在Github上标星 24.2K,累计标星 5.3K(Github地址:https://github.com/google/leveldb




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/111951
 
259 次点击