leveldb学习第一篇——读写的基石

金金 / 102 /

ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。
https://ckai.xyz

1 levelDB读写抽象

在levelDB中,读写能力是通过Env提供的。Env是一个接口类,其提供创建读写代理文件类(是我自己特殊的叫法,因为这些类,本质上是对特定环境下的文件读写的代理。当然Env除了抽象了文件读写之外,还抽象了一部分任务执行或者说叫CPU能力,但是这块实现上还是比较简单),这些代理类根据不同的内核有不同的实现,在levelDB中主要是posix语义的实现以及windows语义的代理文件类。

在实现上,Env并不保有任何的代理文件对象,而是通过几个接口,创建对应的代理文件对象。几个抽象类的关系如下
image.png

Posix语义的实体类关系如下所示
image.png

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


leveldb学习第一篇——读写的基石
作者
金金
许可协议
CC BY 4.0
发布于
2023-09-21
修改于
2025-05-12
Bonnie image
尚未登录