leveldb-原理学习
2017-07-11 15:28
134 查看
这几天都在看leveldb的原理,但是并没有仔细考虑过这种设计的好处以及为什么要这么设计?所以,自己想简单总结一下。
为什么写硬盘?
持久化,这也是有别于redis的区别,因为后者狂吃内存,我们现在用leveldb的原因也就是在于,内存村不下这么多的用户搜索历史。
log文件的作用是什么?为什么要设计这个文件?
为了快速写入硬盘, 必须采用追加方式顺序写到 log 文件. 这导致 log 文件中的数据是无序的,但这也是为什么leveldb具有很好的写性能。
为什么要设计sst文件?
为了快速从硬盘中读取数据, 基于查找算法和局部性原理考虑, 必须将数据排序重新组织到 sst 文件中.如果说log文件是为了快速写,那么设计sst文件的目的就是为了读操作而生。
为什么要多个sst文件,而不是一个就搞定?
使用多个sst,每个sst文件内部都是按key排序的,不同的sst没有交叉(level0)除外,这样可以先快速定位在哪个sst文件,再进行查找。
为什么要level?
这个应该是leveldb的精华,并且我了解还利用了lsm这种数据结构?我自己的感觉是,采用分层的结构,可以简化数据的查找。为了减少 log 文件合并所影响的 sst 文件个数, 将 sst 按层次组织, 层次越深, 文件数量越多. 最坏的情况, 每一次合并都会修改该层次所有的 sst 文件. 而层次越深, 合并发生的概率越小。
动机
这一部分主要参照了这个链接[LevelDB 的原理和动机]为什么写硬盘?
持久化,这也是有别于redis的区别,因为后者狂吃内存,我们现在用leveldb的原因也就是在于,内存村不下这么多的用户搜索历史。
log文件的作用是什么?为什么要设计这个文件?
为了快速写入硬盘, 必须采用追加方式顺序写到 log 文件. 这导致 log 文件中的数据是无序的,但这也是为什么leveldb具有很好的写性能。
为什么要设计sst文件?
为了快速从硬盘中读取数据, 基于查找算法和局部性原理考虑, 必须将数据排序重新组织到 sst 文件中.如果说log文件是为了快速写,那么设计sst文件的目的就是为了读操作而生。
为什么要多个sst文件,而不是一个就搞定?
使用多个sst,每个sst文件内部都是按key排序的,不同的sst没有交叉(level0)除外,这样可以先快速定位在哪个sst文件,再进行查找。
为什么要level?
这个应该是leveldb的精华,并且我了解还利用了lsm这种数据结构?我自己的感觉是,采用分层的结构,可以简化数据的查找。为了减少 log 文件合并所影响的 sst 文件个数, 将 sst 按层次组织, 层次越深, 文件数量越多. 最坏的情况, 每一次合并都会修改该层次所有的 sst 文件. 而层次越深, 合并发生的概率越小。
相关文章推荐
- 【神经网络与深度学习】leveldb的实现原理
- 编译原理学习导论
- 编译原理学习导论
- ASP.net(1.1)原理学习笔记--第一章 ASP.net的基本架构
- ASP.net(1.1)原理学习笔记--第七章 数据绑定Data Binding
- ASP.net(1.1)原理学习笔记--第十一章 安全性Security
- ASP.net(1.1)原理学习笔记--第八章 自定义控件Custom Controls
- ASP.net(1.1)原理学习笔记--第二章 web Form 网页视窗
- 编译原理学习推荐
- ASP.net(1.1)原理学习笔记--第六章 验证 Validation
- 学习.net--事件原理
- 学习插件技术原理后的一点认识
- struts 学习之原理篇
- 少走弯路:学习编译原理的相关建议
- 少走弯路:学习编译原理的相关建议
- 编译原理学习导论
- 最近学习一下DotNet的验证控件的原理
- 编译原理的学习体会和建议
- ASP.net(1.1)原理学习笔记--第三章 配置Configuration
- ASP.net(1.1)原理学习笔记--第十章 状态管理State Management