1 levelDB读写抽象
在levelDB中,读写能力是通过Env提供的。Env是一个接口类,其提供创建读写代理文件类(是我自己特殊的叫法,因为这些类,本质上是对特定环境下的文件读写的代理。当然Env除了抽象了文件读写之外,还抽象了一部分任务执行或者说叫CPU能力,但是这块实现上还是比较简单),这些代理类根据不同的内核有不同的实现,在levelDB中主要是posix语义的实现以及windows语义的代理文件类。
在实现上,Env并不保有任何的代理文件对象,而是通过几个接口,创建对应的代理文件对象。几个抽象类的关系如下
Posix语义的实体类关系如下所示
2 细读PosixEnv
2.1 代理文件类型
2.1.1 PosixSequentialFile——顺序读代理文件类
该类提供顺序读文件的能力,在实现上是对c库的read函数的简单封装,没有特别的操作。
2.1.2 PosixRandomAccessFile——随机读代理文件类
该类提供随机读文件的能力。由于是随机读,所以针对磁盘,levelDB有一个优化操作,是通过mmap将整个文件映射到内存中,然后后续对这片内存进行随机读。当然为了避免使用过多的内存,levelDB使用了一个mmap_limiter来限制可以申请的用于mmap的最大内存数额,如果额度不够,则创建一个PosixRandomAccessFile,否则创建一个PosixMmapReadableFile。
2.1.3 PosixMmapReadableFile——使用Mmap进行随机读的代理文件类
前面已经描述过,此处不再赘述。
2.1.4 PosixWritableFile
该代理类提供基本的写文件功能,levelDB为了加快写文件的速度,维护了一个默认64KB大小的缓存,数据写入时,首先写入缓存。一次写入,如果缓存被写满,那么进行一次刷盘操作。然后判断余下待写入的数据是否仍然大于缓存容量,如果是那么直接写磁盘,如果否则写缓存。
值得注意的是,levelDB将读写能力隔离,如果某个文件被读代理,那么就只具备读文件的能力,反之如果被写代理文件类打开,那么只具备写文件的能力。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。