LevelDB Cache机制

  对于levelDb来说,读取操作如果没有在内存的memtable中找到记录,要多次进行磁盘访问操作。假设最优情况,即第一次就在level 0中最新的文件中找到了这个key,那么也需要读取2次磁盘,一次是将SSTable的文件中的index部分读入内存,这样根据这个index可以确定key是在哪个block中存储;第二次是读入这个block的内容,然后在内存中查找key对应的value。

  levelDb中引入了两个不同的Cache:Table Cache和Block Cache。其中Block Cache是配置可选的,即在配置文件中指定是否打开这个功能。

  

  图9.1是table cache的结构。在Cache中,key值是SSTable的文件名称,Value部分包含两部分,一个是指向磁盘打开的SSTable文件的文件指针,这是为了方便读取内容;另外一个是指向内存中这个SSTable文件对应的Table结构指针,table结构在内存中,保存了SSTable的index内容以及用来指示block cache用的cache_id ,当然除此外还有其它一些内容。

  比如在get(key)读取操作中,如果levelDb确定了key在某个level下某个文件A的key range范围内,那么需要判断是不是文件A真的包含这个KV。此时,levelDb会首先查找Table Cache,看这个文件是否在缓存里,如果找到了,那么根据index部分就可以查找是哪个block包含这个key。如果没有在缓存中找到文件,那么打开SSTable文件,将其index部分读入内存,然后插入Cache里面,去index里面定位哪个block包含这个Key 。如果确定了文件哪个block包含这个key,那么需要读入block内容,这是第二次读取。

  

  

  Block Cache是为了加快这个过程的,图9.2是其结构示意图。其中的key是文件的cache_id加上这个block在文件中的起始位置block_offset。而value则是这个Block的内容。

  如果levelDb发现这个block在block cache中,那么可以避免读取数据,直接在cache里的block内容里面查找key的value就行,如果没找到呢?那么读入block内容并把它插入block cache中。levelDb就是这样通过两个cache来加快读取速度的。从这里可以看出,如果读取的数据局部性比较好,也就是说要读的数据大部分在cache里面都能读到,那么读取效率应该还是很高的,而如果是对key进行顺序读取效率也应该不错,因为一次读入后可以多次被复用。但是如果是随机读取,您可以推断下其效率如何。

参考:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html

最新文章

  1. Rich控件二
  2. 转载:一句代码改变Swing难看的字体
  3. 浅谈页面无刷新技术ajax
  4. Java初试
  5. 隐藏APK在Launcher中的启动图标 android开发教程
  6. SVN服务器搭建(3)
  7. 大区间素数筛选(POJ 2689)
  8. JS string 常用方法总结
  9. 基准对象object中的基础类型----字典 (六)
  10. Json常用组件
  11. axios和promise
  12. ThinkPHP5.*版本发布安全更新
  13. unique(未完成)
  14. ospf精确宣告地址
  15. vnc搭建
  16. IDEA VS 快捷键 大全
  17. 求两点之间距离 C++
  18. CxGrid 表格列内容居中
  19. C++ 实例化对象 p->printX()
  20. sqli-labs学习笔记 DAY3

热门文章

  1. halcon之扫描文档祛底色
  2. 关于将vector以及string传递给较老的api的问题
  3. Sizzle源码分析:二 词法分析
  4. Mysql的日期转换成星期[某天对应周几]
  5. AS中几个较好的插件
  6. Linux软件包安装(rpm、yum、apt-get)
  7. spring-security-4 (2)spring security 基于Java配置的搭建
  8. 2018-2019-2 《网络对抗技术》Exp2 后门原理与实践 20165222
  9. stacks and queues--codility
  10. zipkin对于dubbo的支持