当前位置: 首页 > 科技观察

谷歌牛逼的开源数据库,其实是等到上了Github热榜才知道的

时间:2023-03-18 16:48:19 科技观察

今天想给大家分享一个谷歌开源多年,但还在苦苦挣扎的kv数据库。最近也登上了Github热榜。水平数据库。Leveldb是Google实现的一个非常高效的kv数据库。创作者是著名的JeffDean和SanjayGhemawat。目前1.2版本可以支持亿级数据量。在这个级别也有非常高的性能,主要是由于其良好的设计。LevelDB是一种具有非常高性能的单进程服务。在4个Q6600的CPU机器上,每秒写数据超过40w,而随机读性能超过每秒10w。它具有以下功能特点:key和value可以是字符串或字节流。数据按key排列,有序存储。调用者可以重载排序方法实现自定义排序。基本操作只有三种:Put(key,value),Get(key),Delete(key)提供原子批量修改接口,支持数据快照,支持正向和反向迭代器,支持数据自动压缩,使用snappy压缩算法,和操作系统之间的外部交互是通过虚拟接口(virtualinterface),让用户可以自定义这些交互levelDB是特殊的,但再好的工具也有其局限性,LevelDB的局限性也很明显:这是不是SQL数据库,它没有关系数据模型,不支持SQL查询,也不支持索引。一次只有一个进程(可能有多个线程)可以访问特定的数据库。该库没有内置客户端-服务器支持,需要的用户必须自己打包。如何使用LevelDB打开数据库leveldb数据库的名称对应文件系统目录。数据库的所有内容都存储在这个目录中。下面的例子展示了如何打开数据库:#include#include"leveldb/db.h"leveldb::DB*db;leveldb::Optionsoptions;options.create_if_missing=true;leveldb::Statusstatus=leveldb::DB::Open(options,"/tmp/testdb",&db);assert(status.ok());...如果你想在数据库已经存在的情况下抛出错误,在leveldb::DB::Open之前调用添加以下行:options.error_if_exists=true;关闭数据库完成数据库操作后,只需删除数据库对象即可。示例:...openthedbasdescribedabove...dosomethingwithdb...deletedb;读写数据库提供Put、Delete、Get方法修改/查询数据库。如下:std::stringvalue;leveldb::Statuss=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);concurrently一个数据库只能同时被一个进程打开。leveldb会从操作系统获取锁,防止多个进程同时打开同一个数据库。在单个进程中,同一个leveldb::DB对象可以被多个并发线程安全地使用,也就是说,不同的线程可以写入、从中获取迭代器或调用Get(leveldb实现将确保所需的同步)。但是其他对象,例如Iterator或WriteBatch,需要外部同步保证。如果两个线程共享这样的对象,他们需要使用自己的锁来进行互斥访问。详见相应的头文件。目前,leveldb在Github上已获得24.2K星,总星数为5.3K(Github地址:https://github.com/google/leveldb)。