RocksDB的安装以及基本接口的使用

2023-10-17 13:50

本文主要是介绍RocksDB的安装以及基本接口的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RocksDB的安装以及基本接口的使用

  • 一、简介
  • 二、编译安装
  • 三、基本接口及使用
  • 四、RocksDB高级功能的使用
  • 五、完整编程示例
  • 总结

一、简介

RocksDB 是 Facebook 的一个实验项目,目的是希望能开发一套能在服务器压力下,真正发挥高速存储硬件性能的高效数据库系统。RocksDB是一个存储引擎,不提供网络服务,只专注于具体的存储。这是一个 C++ 库,允许存储任意长度二进制 KV 数据。支持原子读写操作。

RocksDB 依靠大量灵活的配置,使之能针对不同的生产环境进行调优,包括直接使用内存,使用 Flash,使用硬盘或者 HDFS。 支持使用不同的压缩算法,并且有一套完整的工具供生产和调试 使用。

历史:RocksDB 大量复用了 levedb 的代码,并且还借鉴了许多 HBase 的设计理念。原始代码从 leveldb 1.5 上fork 出来。同时 RocksDB 也借用了一些 Facebook 之前就有的理念和代码。

RocksDB 应用场景非常广泛;比如支持 redis 协议的 pika 数据 库,采用 RocksDB 持久化 Redis 支持的数据结构;MySQL 中支 持可插拔的存储引擎,Facebook 维护的 MySQL 分支中支持 RocksDB。

所有的数据库需求都可以转化为key-value数据库。RocksDB可以调优(基于配置项)、测试。
在这里插入图片描述
RocksDB具有以下优势:

  • 高性能:RocksDB使用了一些优化技术,例如基于内存和磁盘的排序、压缩以及多线程并发等,使其在读写操作方面都表现出极高的性能。
  • 可靠性:RocksDB支持多种数据格式,可以自动检测和修复损坏的数据。同时也提供了数据备份和恢复功能。
  • 易用性:RocksDB简单易用,在数据库的创建、打开、写入和查询方面提供了简单而有效的API接口,并且还提供了大量示例代码以帮助用户快速上手。
  • 可扩展性:RocksDB支持分布式存储,并可以通过sharding或replication来实现水平扩展。

基于以上优点,RocksDB适合应用于以下场景:

  1. 网络服务器:作为后端存储服务,支持快速读写操作和高并发访问;

  2. 分布式系统:作为分布式系统中的数据存储引擎,支持高可靠性和水平扩展;

  3. 互联网广告系统:作为广告检索引擎中的索引存储组件,快速响应请求;

  4. 移动设备应用:作为移动应用的本地存储引擎,支持快速读写操作和数据备份等功能。

二、编译安装

(1)下载和安装RocksDB源代码。对编译器版本有要求,要求编译器能支持C++17。

git clone https://github.com/facebook/rocksdb.git
cd rocksdb
# 编译成调试模式
make
# 编译成发布模式
make static_lib

(2)安装依赖库:需要先安装一些必要的依赖库,如snappy、gflags、zlib等压缩库。rocksdb 支持多种压缩模式。

ubuntu:# rocksdb 支持多种压缩模式
# gflags
sudo apt-get install libgflags-dev
# snappy
sudo apt-get install libsnappy-dev
# zlib
sudo apt-get install zlib1g-dev
# bzip2
sudo apt-get install libbz2-dev
# lz4
sudo apt-get install liblz4-dev
# zstandard
sudo apt-get install libzstd-dev

centos:

# gflags
git clone https://github.com/gflags/gflags.git
cd gflags
git checkout v2.0
./configure && make && sudo make install
# snappy
sudo yum install snappy snappy-devel
# zlib
sudo yum install zlib zlib-devel
# bzip2
sudo yum install bzip2 bzip2-devel
# lz4
sudo yum install lz4-devel
# ASAN (optional for debugging)
sudo yum install libasan
# zstandard
sudo yum install libzstd-devel

(3)配置环境变量:将RocksDB的库路径添加到LD_LIBRARY_PATH环境变量中,以便程序可以正确地链接和加载库文件。

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

(4)测试是否成功,执行以下命令测试:

cd rocksdb/
make check

如果所有测试都通过,则表示RocksDB已经成功安装。

三、基本接口及使用

在这里插入图片描述

Status Open(const Options& options, const std::string& dbname, DB** dbptr);
Status Get(const ReadOptions& options, const Slice& key, std::string* value);
Status Get(const ReadOptions& options, ColumnFamilyHandle* column_family, const Slice& key, std::string* value);
Status Put(const WriteOptions& options, const Slice& key, const Slice& value);
Status Put(const WriteOptions& options, ColumnFamilyHandle* column_family, const Slice& key, const Slice& value);
// fix read-modify-write 将 读取、修改、写入封装到一个接口中
Status Merge(const WriteOptions& options, const Slice& key, const Slice& value);
Status Merge(const WriteOptions& options, ColumnFamilyHandle* column_family, const Slice& key, const Slice& value);
// 标记删除,具体在 compaction 中删除
Status Delete(const WriteOptions& options, const Slice& key);
Status Delete(const WriteOptions& options, ColumnFamilyHandle* column_family, const Slice& key, const Slice& ts);
// 针对从来不修改且已经存在的key; 这种情况比 delete 删除的快;
Status SingleDelete(const WriteOptions& options, const Slice& key);
Status SingleDelete(const WriteOptions& options, ColumnFamilyHandle* column_family,  const Slice& key);
// 迭代器会阻止 compaction 清除数据,使用完后需要释放;
Iterator* NewIterator(const ReadOptions& options);
Iterator* NewIterator(const ReadOptions& options, ColumnFamilyHandle* column_family)

RocksDB的基本接口可以分为以下几个部分:

  1. 打开数据库:使用rocksdb::DB::Open()函数打开数据库,返回一个rocksdb::DB对象。示例:
#include <rocksdb/db.h>rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;  // 如果数据库不存在,则创建
rocksdb::Status status = rocksdb::DB::Open(options, "/path/to/db", &db);
if (!status.ok()) {// 处理错误
}
  1. 写入数据:使用rocksdb::DB::Put()函数写入数据,需要指定键值对的key和value。示例:
std::string key = "my_key";
std::string value = "my_value";
rocksdb::Status status = db->Put(rocksdb::WriteOptions(), key, value);
if (!status.ok()) {// 处理错误
}
  1. 读取数据:使用rocksdb::DB::Get()函数读取数据,需要指定要读取的key,并将value保存在一个std::string类型的变量中。如果找不到该key,则返回NotFound状态。示例:
std::string key = "my_key";
std::string value;
rocksdb::Status status = db->Get(rocksdb::ReadOptions(), key, &value);
if (status.IsNotFound()) {// 处理未找到key的情况
} else if (!status.ok()) {// 处理其他错误
} else {// 成功读取到了value
}
  1. 删除数据:使用rocksdb::DB::Delete()函数删除数据,需要指定要删除的key。示例:
std::string key = "my_key";
rocksdb::Status status = db->Delete(rocksdb::WriteOptions(), key);
if (!status.ok()) {// 处理错误
}
  1. 批量写入数据:使用rocksdb::WriteBatch类可以实现批量写入多个键值对。示例:
rocksdb::WriteBatch batch;
batch.Put("key1", "value1");
batch.Put("key2", "value2");
batch.Delete("key3");
rocksdb::Status status = db->Write(rocksdb::WriteOptions(), &batch);
if (!status.ok()) {// 处理错误
}
  1. 遍历数据:使用rocksdb::Iterator类可以遍历整个数据库中的所有键值对。示例:
// 创建迭代器,并将其设置到第一个键值对的位置
rocksdb::Iterator* it = db->NewIterator(rocksdb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {std::cout << it->key().ToString() << ": " << it->value().ToString() << std::endl;
}
if (!it->status().ok()) {// 处理错误
}
delete it;

四、RocksDB高级功能的使用

RocksDB是一种高性能的键值存储引擎,支持各种高级功能。

  1. 压缩。RocksDB支持多种压缩算法,包括LZ4、Snappy和Zlib。在创建数据库时,可以通过Options设置压缩算法和压缩级别。

示例代码:

rocksdb::Options options;
options.compression = rocksdb::kSnappyCompression;
options.compression_level = 6;
rocksdb::DB* db;
rocksdb::Status status = rocksdb::DB::Open(options, "/path/to/db", &db);
  1. 列族。列族是将数据按照逻辑分组的方式,在RocksDB中可以更好地管理数据。每个列族有自己的选项和元数据,可以单独进行配置。

示例代码:

rocksdb::ColumnFamilyHandle* cfh;
rocksdb::ColumnFamilyOptions cf_options;
cf_options.compression = rocksdb::kSnappyCompression;
cf_options.compression_level = 6;
std::vector<rocksdb::ColumnFamilyDescriptor> column_families;
column_families.push_back(rocksdb::ColumnFamilyDescriptor(rocksdb::kDefaultColumnFamilyName, rocksdb::ColumnFamilyOptions()));
column_families.push_back(rocksdb::ColumnFamilyDescriptor("my_cf", cf_options));
std::vector<rocksdb::ColumnFamilyHandle*> handles;
rocksdb::DB* db;
rocksdb:Status status = rocksdb:DB:Open(rocksbd:Options(), "/path/to/db", column_families, &handles, &db);
  1. 过滤器。RocksDB支持布隆过滤器和前缀过滤器,可以大幅提升查询效率。在创建数据库时,可以通过Options设置过滤器类型和参数。

示例代码:

rocksdb::BlockBasedTableOptions table_options;
table_options.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10));
rocksdb::Options options;
options.table_factory.reset(rocksdb::NewBlockBasedTableFactory(table_options));
rocksdb::DB* db;
rocksdb::Status status = rocksdb::DB::Open(options, "/path/to/db", &db);
  1. 后台压缩。RocksDB支持后台压缩,即在后台线程中对SST文件进行压缩操作。这样可以避免在写入时造成的性能下降。在创建数据库时,可以通过Options设置后台压缩选项。

示例代码:

rocksdb::Options options;
options.compaction_style = rocksdb::kCompactionStyleUniversal;
options.max_background_compactions = 2;
options.max_background_flushes = 1;
options.compaction_options_universal.max_size_amplification_percent = 50;
rocksdb::DB* db;
rocksdb:Status status = rocksbd:DB:Open(options, "/path/to/db", &db);
  1. 内存管理。RocksDB支持多种内存管理方式,包括TBB、jemalloc和libc等。可以根据实际需求进行选择和配置。

示例代码:

rocksdb::Cache* cache = rocksdb::NewLRUCache(1000000);
rocksdb::Options options;
options.block_cache = cache;
options.use_fsync = true;
rocksdb::DB* db;
rocksdb:Status status = rocksbd:DB:Open(options, "/path/to/db", &db);
  1. 多线程读写。RocksDB支持多线程读写,可以通过设置选项来开启并发读写。

示例代码:

rocksdb::Options options;
options.allow_concurrent_memtable_write = true;
options.enable_write_thread_adaptive_yield = true;
options.write_thread_max_yield_usec = 1000 * 1000;
rocksdb::DB* db;
rocksbd:Status status = rocksbd:DB:Open(options, "/path/to/db", &db);

五、完整编程示例

#include <cstdio>
#include <string>#include "rocksdb/db.h"
#include "rocksdb/slice.h"
#include "rocksdb/options.h"using ROCKSDB_NAMESPACE::DB;
using ROCKSDB_NAMESPACE::Options;
using ROCKSDB_NAMESPACE::PinnableSlice;
using ROCKSDB_NAMESPACE::ReadOptions;
using ROCKSDB_NAMESPACE::Status;
using ROCKSDB_NAMESPACE::WriteBatch;
using ROCKSDB_NAMESPACE::WriteOptions;// rocksdb存储路径
std::string kDBPath="/home/tmp/rocksdb_simple"int main()
{DB* db;Options options;options.IncreaseParallelism();//文件夹没有数据就创建Options.create_if_missing=true;// 打开数据库,加载数据到内存Status s=DB::Open(options,kDBPath,&db);assert(s.ok());// 写key-values=db->Put(WriteOptions(),"key01","value");assert(s.ok());std::string value;s=db->get(ReadOptions(),"key01",&value);assert(s.ok());assert(value=="value");// 管道,原子方式更新{WriteBatch batch;batch.Delete("key01");batch.Put("key02",value);s=db->Write(WriteOptions(),&batch);} s=db->Get(ReadOptions(),"key01",&value);assert(s.IsNotFound());s=db->Get(ReadOptions(),"key02",&value);assert(value=="value");{PinnableSlice pinnable_val;// 列族方式读取db->Get(ReadOptions(),db->DefaultColumnFamily(),"key02",&pinnable_val);assert(pinnable_val=="value");}{std::string string_val;PinnableSlice pinnable_val(&string_val);// 列族方式读取db->Get(ReadOptions(),db->DefaultColumnFamily(),"key02",&pinnable_val);assert(pinnable_val=="value");assert(pinnable_val.IsPinned() || string_value == "value");}PinnableSlice pinnable_val;s=db->Get(ReadOptions(),db->DefaultColumnFamily(),"key01",&pinnable_val);assert(s.IsNotFound()");pinnable_val.Reset();db->Get(ReadOptions(),db->DefaultColumnFamily(),"key02",&pinnable_val);assert(pinnable_val=="value");pinnable_val.Reset();delete db;return 0;
}

编译:

g++ simple.cc -o simple -std=c++17 ../librocksdb.a -I../include -lpthread -ldl -lrt -lsnappy -lgflags -lz -lbz2 -llz4 -lzstd

总结

RocksDB是一个高性能的键值存储库,其基本接口相对简单,主要包括打开数据库、写入数据、读取数据、删除数据、批量写入数据和遍历数据等操作:

  1. 打开数据库:

使用rocksdb::DB::Open()函数打开数据库,需要设置选项和数据库路径。

  1. 写入数据:

使用rocksdb::DB::Put()函数写入数据,需要设置写入选项、键和值。

  1. 读取数据:

使用rocksdb::DB::Get()函数读取数据,需要设置读取选项和键,返回的值通过函数参数返回。

  1. 删除数据:

使用rocksdb::DB::Delete()函数删除数据,需要设置删除选项和键。

  1. 批量写入数据:

使用rocksdb::WriteBatch类进行批量写入数据,需要设置写入选项和多个键值对。

  1. 遍历数据:

使用rocksdb::Iterator类进行遍历数据,需要设置读取选项,可以按顺序遍历整个数据库或者指定前缀的数据。

需要注意的是,RocksDB支持多种选项设置和配置,例如存储引擎、压缩方式、持久化方式等,可以根据实际需求进行设置。

RocksDB是一个非常高效、稳定、可靠的键值存储库,其基本接口使用方法相对简单,可以方便地进行键值存储和访问操作,适用于需要高性能键值存储的各种场景。
在这里插入图片描述

这篇关于RocksDB的安装以及基本接口的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/225809

相关文章

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I