图解|什么是高并发利器NoSQL( 三 )
文章插图
LevelDB具有很高的随机写 , 顺序读/写性能 , 因此LevelDB很适合应用在写多读少的场景 , 真让人好奇高性能的随机写怎么做到的 。
5.1.1 LSM树
很多数据在逻辑上相近 , 但是在物理存储上却可能相隔很远 , 这样就会造成大量的随机读写问题 , 从而降低性能 。
LevelDB实现高性能随机写的秘密武器在于使用LSM树存储结构 , LSM树又称为日志结构合并树(Log-Structured Merge-Tree) , 它并不是具体的数据结构 , 而是一种设计思想 。
LSM树对于每次写入操作 , 并不是直接将最新的数据驻留在磁盘中 , 而是将数据先放在内存 。
当内存数据达到一定的阈值 , 再将这部分数据真正刷新到磁盘文件中 , 从而将磁盘随机写转换为内存顺序写 , 因而获得了极高的写性能 , 但是这种机制会降低读的性能 , 总体来说降低部分读性能来大幅提升写性能是值得的 。
文章插图
5.1.2 LevelDB整体架构
文章插图
LevelDB 存储结构主要由六个部分组成:
- MemTable:内存数据结构 , 使用SkipList实现 , 新的数据修改会首先在这里写入 , 并且有容量限制 。
- Immutable MemTable:待落盘的数据库内存结构 , 当 MemTable的大小达到设定的阈值时 , 会变成 Immutable MemTable , 只接受读操作 , 不再接受写操作 , 后续会Flush到磁盘上 。
- SST Files:Sorted String Table Files , 磁盘数据存储文件 , 分为 Level0 到 LevelN 多层 , 每一层包含多个 SST 文件 , 文件内数据有序 。
- Manifest Files:leveldb元信息清单文件 。 Manifest记录 SST 文件在不同 Level 的分布 , 相当于SST文件的索引 。
- Current File:当前正在使用的文件清单文件 。
5.2 脸书出品RocksDB
青出于蓝而胜于蓝 。
RocksDB在LevelDB的基础上进行了改进和优化 , 也成为后续很多NoSQL所选择的存储引擎 。
RocksDB仍然是采用C++开发的 , 并且完全向后兼容了LevelDB的接口 , 可以说是个平滑升级 。
5.2.1 RocksDB提升点
来看看RocksDB做了哪些优化和提升:
- RocksDB支持一次获取多个Key , 还支持Key范围查找 , LevelDB只能获取单个Key 。
- RocksDB支持多线程合并 , 而LevelDB是单线程合并的 , 多核时代前者效率更高 。
- RocksDB增加了合并时过滤器 , 对不符合条件的Key进行丢弃 。
- RocksDB可采用多种压缩算法 , 除了LevelDB用的snappy , 还有zlib、bzip2 。
- RocksDB支持增量备份和全量备份 。

5.2.2 RocksDB整体架构
Rocksdb中引入了Column Family(列族的概念 , 所谓列族也就是一系列kv组成的数据集 , 所有的读写操作都需要先指定列族 。
每个ColumnFamily有自己的Memtable ,SST文件 , 所有ColumnFamily共享WAL、Current、Manifest文件 。

如果说LevelDB是个平民版的NoSQL存储引擎 , 那么RocksDB绝对是尊享版 , 所以很多优秀的NoSQL成品都是基于RocksDB来封装上层协议和代理支持完成的 。
- 5G手机越来越普及,但为什么4G的iPhone依旧那么火热?
- Linux培训完能到什么水平,之后还需要学习哪些技术?
- 人机交互过程拆解:是什么?怎么做?
- 更新了!深入浅出图解Git,入门到精通(保姆级教程)第三篇
- 手机边充边玩,为什么电量却越来越少?看完你就不敢再这样做了
- 世界上第一台计算机是什么?为什么使用二进制而不是十进制?
- 为什么iPhone能卖一万,并不觉得贵?分享数码博主内心独白
- 任正非,又在下一盘什么棋?沉默4个月后,他再度活跃
- 为什么苹果做不好智能音箱,HomePad靠降价能否提振销量?
- 给爸妈买手机需要注意些什么?这几点很重要