当前位置: 首页 > news >正文

RocksDB

引言

RocksDB 是 Facebook 的一个实验项目,目的是希望能开发一套能在服务器压力下,真正发挥高 速存储硬件性能的高效数据库系统。这是一个C++库,允许存储任意长度二进制 KV 数据。支持原 子读写操作。
RocksDB 依靠大量灵活的配置,使之能针对不同的生产环境进行调优,包括直接使用内存,使用 Flash,使用硬盘或者 HDFS。支持使用不同的压缩算法,并且有一套完整的工具供生产和调试使用。
RocksDB 大量复用了 levedb 的代码,并且还借鉴了许多 HBase 的设计理念。原始代码从
leveldb 1.5 上fork 出来。同时 RocksDB 也借用了一些 Facebook 之前就有的理念和代码。
RocksDB 应用场景非常广泛;比如支持 redis 协议的 pika 数据库,采用 RocksDB 持久化 redis 支持的数据结构;MySQL 中支持可插拔的存储引擎,facebook 维护的 MySQL 分支中支持 RocksDB;

高度分层架构

RocksDB 是一种可以存储任意二进制kv数据的嵌入式存储。RocksDB 按顺序组织所有数据,他们 的通用操作是 Get(key) , NewIterator() , Put(key, value) , Delete(Key) 以及SingleDelete(key) 。
RocksDB 有三种基本的数据结构:memtable,sstfile以及logfile。memtable是一种内存数据结 构——所有写入请求都会进入 memtable,然后选择性进入 logfile。logfile 是一个在存储上顺序 写入的文件。当memtable 被填满的时候,他会被刷到 sstfile 文件并存储起来,然后相关的 logfile 会在之后被安全地删除。sstfile 内的数据都是排序好的,以便于根据 key 快速搜索。
RocksDB 是基于 lsm-tree (log structured merge - tree) 实现;

一.LSM-Tree

1.为什么使用LSM-Tree而不用B+树 作为 RocksDB底层的数据结构

在rocksdb中,面对海量数据的写入的是永远绝对的优势的,分别在wal写入直接落盘和写入内存然后再落盘 

LSM-Tree 的核心思想是利用顺序写来提升写性能;LSM-Tree 不是一种树状数据结构,仅仅是一 种存储结构;LSM-Tree 是为了写多读少(对读的性能实时性要求相对较低)的特定场景而提出的
解决方案;如日志系统、海量数据存储、数据分析;
2.重点介绍一下LSM-Tree 体系结构

 

①MemTable  在内存中的一个可读可写表

 读取在查询 SST 文件前总是要查询 memtable,因为 memtable 里面的数据总是更新的。一旦一个 memtable 被写满,他会变成不可修改的,并被一 个新的 memtable 替换。一个后台线程会把这个 memtable 的内容落盘到一个 SST 文件,然后这 个 memtable 就可以被销毁了

 

 

 ②Immutable MemTable 在内存中的一个只读表

Immutable MemTable 也是存储在内存中的数据,不过是只读的内存数据; 当 MemTable 写满后,会被置为只读状态,变成 Immutable MemTable。然后会创建一块新的MemTable 来提供写入操作;Immutable MemTable 将异步 flush 到 SST 中;

 ③WAL

写入的数据会备份到wal 然后直接通过flush刷到磁盘 

 ③SST

SST (Sorted String Table) 有序键值对集合;是 LSM-Tree 在磁盘中的数据结构;可以通过建立 key 的索引以及布隆过滤器来加快 key 的查询;LSM-Tree 会将所有的 DML 操作记录保存在内存 中

 RocksDB 的数据落盘时机主要包括:MemTable 达到阈值时刷写为 SSTable后台 Compaction 合并 SSTable 文件手动调用 Flush/Compact 接口 或 数据库关闭时强制同步

二.RocksDB接口的使用案例 

1.main.cpp
#include <iostream>
#include <rocksdb/db.h>int main() {rocksdb::DB *db;rocksdb::Options options;options.create_if_missing = true;// 打开数据库rocksdb::Status status = rocksdb::DB::Open(options, "test1", &db);assert(status.ok());// 写入 key-valuestatus = db->Put(rocksdb::WriteOptions(), "name", "lion");assert(status.ok());// 读取 keystd::string value;status = db->Get(rocksdb::ReadOptions(), "name", &value);if (status.ok()) {std::cout << "name:" << value << std::endl;} else {std::cout << "Get failed" << std::endl;}// 删除 keystatus = db->Delete(rocksdb::WriteOptions(), "name");assert(status.ok());delete db;return 0;
}
2.CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(rocksdb_example)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Threads REQUIRED)# 手动指定 rocksdb 路径
include_directories(/usr/local/include)
link_directories(/usr/local/lib)add_executable(rocksdb_example main.cpp)target_link_libraries(rocksdb_examplerocksdbThreads::Threadsz stdc++fs bz2 snappy lz4 zstd  # RocksDB 可能依赖的库
)
3.总结

rocksdb虽然对外的接口不多但是options选项有百来个,扩展性非常大

相关文章:

  • 对比RFX2401C:AT2401C功率放大器的性价比与PIN兼容方案
  • 2025年5月AI科技领域周报(5.19-5.25):大模型多模态突破 具身智能开启机器人新纪元
  • qt ubuntu 20.04 交叉编译
  • jq checked选中触发事件
  • 代码输出题:异步事件循环
  • 梯形面积计算shell脚本
  • Java设计模式之设计原则
  • 深入解析 Spring @Transactional 的事务开启机制
  • 【计算机网络】第1章:概述—分组延时、丢失和吞吐量
  • BugKu Web渗透之矛盾
  • 电脑长期不关机会怎样?
  • HarmonyOS 5 应用开发导读:从入门到实践
  • CloudCompare|点测量功能源码分析
  • ABP VNext + CRDT 打造实时协同编辑
  • 怎么快速判断一款MCU能否跑RTOS系统
  • OpenCV CUDA模块直方图计算------在 GPU 上计算图像直方图的函数calcHist()
  • XCTF-web-mfw
  • vue修改配置文件.env.development不生效
  • STM32:ESP8266 + MQTT 云端与报文全解析
  • MCP Server的五种主流架构:从原理到实践的深度解析
  • 建设企业展示网站/沈阳关键词快照优化
  • 政府门户网站建设管理工作总结/seo免费诊断电话
  • 中国建设银行企业信息门户网站/微信小程序开发流程
  • 海南网站建设网站开发/西安关键词优化平台
  • 同和网站建设/公司搜索seo
  • 手机网站 免费/怎么做神马搜索排名seo