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

RocksDb 是什么?levelDB、LSM 树、SSTable又分别是什么?区别呢?

Git高速下载
程序员面试资料大全|各种技术书籍等资料-1000G


1. LSM 树 (Log-Structured Merge-Tree)

  • 核心思想:用顺序写(高效)代替随机写(低效),通过后台合并操作处理数据更新和删除。
  • 工作流程
    1. 写入:先写入内存中的MemTable(有序数据结构,如跳表)。
    2. MemTable写满:转为只读的Immutable MemTable,并刷盘生成SSTable文件。
    3. 合并(Compaction):分层合并SSTable文件,丢弃旧数据/重复数据,生成新文件。
  • 优势:高写入吞吐(尤其HDD/SSD)、适合写多读少场景。
  • 代价:读操作可能需要查多层(需优化),写放大(Compaction带来额外I/O)。

2. SSTable (Sorted String Table)

  • 定义:LSM树在磁盘上的数据存储格式。核心特点:
    • 不可变(Immutable):文件生成后不再修改。
    • 按键有序:数据按Key排序存储,支持高效范围查询。
    • 分块索引:含索引块(快速定位Key)、布隆过滤器(加速Key不存在判断)。
  • 合并机制:多个SSTable通过归并排序合并成更大的新文件,删除旧数据。

3. LevelDB

  • 背景:Google开源的单机KV存储引擎(2011年),LSM树的经典实现
  • 设计特点
    • 分层存储(Leveled Compaction)
      • Level 0:MemTable刷盘后的SSTable(文件间Key可能重叠)。
      • Level 1+:每层内SSTable全局有序,文件间Key不重叠。
    • 简单轻量:C++实现,无分布式功能,适合嵌入式场景。
  • 局限
    • 单线程Compaction可能阻塞写入。
    • 功能较基础(如不支持多线程合并、压缩算法单一)。

4. RocksDB

  • 背景:Facebook基于LevelDB深度优化的开源引擎(2013年),工业级增强版
  • 核心改进
    特性LevelDBRocksDB
    Compaction单线程多线程并行
    写入优化单一MemTable支持多MemTable(Pipeline写入)
    压缩算法仅SnappyZlib, ZSTD, LZ4, BZip2等
    事务支持悲观/乐观锁、WriteBatch增强
    增量备份支持
    布隆过滤器单层多层、格式可定制
    SSD优化基础精细控制I/O、限速
  • 应用场景
    • 数据库底层存储(MySQL的MyRocks、MongoDB、TiKV)。
    • 消息队列(Apache Pulsar)、图数据库(Dgraph)。

关键关联总结

设计思想
磁盘存储格式
优化实现
工业级特性
分层合并
LSM 树
LevelDB/RocksDB
SSTable
RocksDB
多线程Compaction
事务支持
丰富API
Leveled Compaction

常见问题

Q: LSM树为何写快读慢?
A:写入只需顺序写MemTable;读取可能需要查MemTable + 多层SSTable(需BloomFilter/索引优化)。

Q: Compaction为何必要?
A:清理过期数据、合并碎片文件、减少读放大,但会引发写放大(I/O与CPU消耗)。

Q: LevelDB vs RocksDB如何选?
A:

  • LevelDB:轻量级、代码易读、适合学习或简单场景。
  • RocksDB:生产环境首选,高并发、SSD优化、企业级功能完备。

程序员面试资料大全|各种技术书籍等资料-1000G
Git高速下载

在这里插入图片描述

http://www.lryc.cn/news/609359.html

相关文章:

  • Java,八股,cv,算法——双非研0四修之路day24
  • 2025年测绘程序设计比赛--基于统计滤波的点云去噪(已获国特)
  • 【AI】文档理解
  • 旧笔记本电脑如何安装飞牛OS
  • 嵌入式学习日志——数据结构(一)
  • 渗透高级-----应急响应
  • LLM调研
  • nestjs @Param 从入门到精通
  • 大模型能力测评(提示词请帮我把这个项目改写成为python项目)
  • 数据结构基础 - 平衡二叉树
  • 关于 xrdp远程桌面报错“Error connecting to sesman on 127.0.0.1:3350“的解决方法
  • lua table常用函数汇总
  • 6. 平台总线
  • 模型学习系列之参数
  • 秋招笔记-8.3
  • 关于记录一下“bug”,在做图片上传的时候出现的小问题
  • 验房收房怎么避免被坑?
  • 我的世界进阶模组开发教程——伤害(2)
  • 自己实现一个freertos(2)任务调度 1——最基本的TCB
  • 深入解析HashMap:原理与性能优化
  • Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
  • spring batch处理数据模板(Reader-Processor-Writer模式)
  • Timer实现定时调度的原理是什么?
  • PPT 转高精度 PDF API 接口
  • 使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片
  • Coin Combinations I(Dynamic Programming)
  • Docker环境离线安装指南
  • 解剖 .NET 经典:从 Component 到 BackgroundWorker
  • node.js常用函数
  • GaussDB case when的用法