Categories: C/C++

rocksdb/

RocksDB — это встраиваемая база данных на основе LSM-tree с открытым исходным кодом (лицензция Apache 2.0) от компании Facebook. Является форком LevelDB, созданной в Google. В RocksDB устранены многие недостатки LevelDB и, кроме того, существенно расширен функционал. Из известных пользователей RocksDB можно привести в пример Facebook, Yahoo, LinkedIn, Airbnb, Pinterest, Uber и Netflix. Кроме того, RocksDB используется в таких проектах, как CockroachDB , TiDB и Apache Flink. Из этой статьи вы узнаете, как использовать RocksDB в своих проектах.

Многие дистрибутивы Linux предлагают готовый пакет RocksDB. Например, в Ubuntu пакет называется librocksdb-dev , а в Arch Linux пакет rocksdb доступен на AUR.

В проектах, использующих CMake , подключить RocksDB проще простого:

# …

find_library ( ROCKSDB_LIBRARY rocksdb )

# …

target_link_libraries ( main ${ROCKSDB_LIBRARY} )

Рассмотрим примеры кода. Открытие и закрытие базы данных производится так:

/* … */

using namespace rocksdb ;

PersistentStorage :: PersistentStorage ( ) {
_db = nullptr ;

Options options ;

options. IncreaseParallelism ( ) ;
options. OptimizeLevelStyleCompaction ( ) ;
options. create_if_missing = true ;

Status s = DB :: Open ( options, «hurma_data» , & _db ) ;
if ( ! s. ok ( ) )
throw std :: runtime_error ( «DB::Open failed» ) ;
}

PersistentStorage :: ~PersistentStorage ( ) {
if ( _db ! = nullptr )
delete _db ;
}

… где _db — это private член класса:

/* … */

#include <rocksdb/db.h>

class PersistentStorage : public Storage {

/* … */

PersistentStorage ( PersistentStorage const & ) = delete ;
void operator = ( PersistentStorage const & ) = delete ;
private :
rocksdb :: DB * _db ;
} ;

Чтение, запись и удаление данных:

std :: string PersistentStorage :: get ( const std :: string & key,
bool * found ) {
std :: string value = «» ;
Status s = _db > Get ( ReadOptions ( ) , key, & value ) ;
* found = s. ok ( ) ;
return value ;
}

void PersistentStorage :: set ( const std :: string & key,
const std :: string & value ) {
/* … */
Status s = _db > Put ( WriteOptions ( ) , key, value ) ;
if ( ! s. ok ( ) )
throw std :: runtime_error ( «_db->Put failed» ) ;
}

void PersistentStorage :: del ( const std :: string & key, bool * found ) {
std :: string value = «» ;
Status s = _db > Get ( ReadOptions ( ) , key, & value ) ;
* found = s. ok ( ) ;
if ( ! * found )
return ;
s = _db > Delete ( WriteOptions ( ) , key ) ;

* found = s. ok ( ) ;
}

Заметьте, что для индикации ошибок RocksDB не бросает исключения, а использует специальный класс Status . Это было сделано специально, чтобы библиотеку можно было использовать в проектах на C++ как использующих исключения, так и не использующих (такая практика принята в некоторых компаниях).

Сканирование по диапазону ключей делается так:

#include «defer.h»

/* … */

std :: string PersistentStorage :: getRange ( const std :: string & key_from,
const std :: string & key_to ) {
Iterator * it = _db > NewIterator ( ReadOptions ( ) ) ;
defer ( delete it ) ;

/* … */

for ( it > Seek ( key_from ) ;
it > Valid ( ) && it > key ( ) . ToString ( ) <= key_to ;
it > Next ( ) )
{
std :: string key = it > key ( ) . ToString ( ) ;
std :: string value = it > value ( ) . ToString ( )

/* … */
}

// Check for any errors found during the scan
if ( ! it > status ( ) . ok ( ) )
throw std :: runtime_error ( «Error during the scan» ) ;

/* … */
}

Здесь используется библиотека deferxx , уже знакомая нам по заметке Продолжаем изучение OpenGL: управление камерой при помощи мыши и клавиатуры . Библиотека реализует оператор defer , автоматический выполняющий кусок кода при выходе из метода, независимо от того, вернул ли он управление штатно, или же было брошено исключение.

Как видите, все достаточно просто. Полную версию исходного кода вы найдете в этом репозитории на GitHub . По крайней мере, он там точно был в районе коммита 9c2033ae, но в будущем ситуация может и измениться. Вам нужен файл PersistentStorage.cpp.

Дополнительные материалы:

А доводилось ли вам работать с RocksDB и если да, то каковы ваши впечатления от него?

Дополнение: Пример простейшей key-value СУБД на основе Badger

admin

Share
Published by
admin
Tags: C/C++

Recent Posts

Лучшие дистрибутивы Linux

Если говорить о том, какие лучшие дистрибутивы Linux мы знаем, то этот список может быть…

6 дней ago

Лучшие браузеры для Ubuntu

Хотя Ubuntu и поставляется со встроенным обозревателем Firefox многие пользователи считают что это не самая…

6 дней ago

Установка Remmina Ubuntu 16.04 или 16.10

Что такое Remmina? Remmina — это совершенно бесплатный и свободный клиент так называемого удаленного рабочего…

6 дней ago

Плюсы Ubuntu

Как мы знаем, Ubuntu это самая популярная сборка из систем на базе ядра Linux. У…

6 дней ago

Выбираем ноутбук для Linux

Выбор ноутбука для каждого пользователя это довольно кропотливый процесс. Люди стараются подобрать ноутбук который будет…

6 дней ago

Установка Linux рядом с Windows 10

Если вы решили ознакомиться с операционной системой Linux более детально и задались вопросом как установить…

6 дней ago