
上QQ阅读APP看书,第一时间看更新
2.5 系统参数
在源码中,头文件options.h中定义了一系列与数据库操作相关的选项参数类型,例如与数据库操作相关的Options,与读操作相关的ReadOptions,与写操作相关的WriteOptions。这几个类型均为结构体,在进行数据库的初始化、数据库的读写等操作时,这些参数直接决定了数据库相关的性能指标。本节将针对这3个参数类型中具体的成员变量进行描述,确定每一个成员变量的实际含义与作用。
2.5.1 DB参数Options
参数Options主要在DB::Open方法中进行函数的参数传递。这是一个struct类型的变量,其内部参数可以分为两块:影响行为的参数与影响性能的参数。
(1)影响行为的参数主要有以下几个。
- const Comparator* comparator:比较器,用于定义table中key按照何种规则进行排序。如果不对这个参数进行指定,则默认按照字典顺序的比较器定义,即前面所讲的BytewiseComparatorImpl。在实际调用时,客户端需要保证排序时所使用的comparator与数据库进行Open操作时传入的comparator名字相同。
- bool create_if_missing:默认为false,如果设置为true,表示当数据库不存在时,如果调用Open方法则创建新的数据库。
- error_if_exists:默认为false,如果设置为true,则在进行Open操作时,首先判断该数据库是否存在,如果存在则触发一个错误。
- bool paranoid_checks:默认为false。如果设置为true,将会对数据进行大量的检测工作,如果检测到任何错误,则会停止检测。这样会造成某些不可预见的后果,例如数据库中的某一个数据实体的错误将造成大量的数据实体不可读,或整个数据库不能打开。
- Env* env:环境变量,主要用于与系统环境进行交互,如读文件、写文件、调度后台线程任务等。Env的默认值为Env::Default()。
- Logger* info_log:如果不为NULL,则运行时产生的中间过程或错误信息会被写入到info_log中;如果为NULL,则会将这些信息存储在与DB相同路径下的目录中。
(2)影响性能的参数主要有以下几个。
- size_t write_buffer_size:内存中将要写入到硬盘文件(sorted on-disk file)的数据量大小,默认为4MB。该参数增大,则会提升性能,特别是在大量加载的场景中。内存中最多同时保存2个写缓存。此外,写缓存越大,则DB在下次打开过程中恢复的时间越长。
- int max_open_files:DB所能使用的最大打开文件数。如果在应用场景中有一个大的数据集,则可以增大该参数。该参数默认为1000。
- Cache* block_cache:block是从硬盘上读数据的单位,用户的数据就存储在许多block中。默认为NULL,LevelDB自动创建并使用8MB的缓存。如果不为空,则由用户指定相对应的block缓存。
- size_t block_size:用户数据每一个block的大小,默认为4KB。block size参数针对的是没有压缩的数据。如果使用了压缩功能,则实际每个单位block从硬盘中读取的数据大小可能会较小。这个参数可以进行动态修改。
- int block_restart_interval:默认值为16,主要用于表示重启点间key的个数,一般而言,多数调用不需要考虑这个参数。
- size_t max_file_size:默认为2MB。指定LevelDB向一个文件写入字节的最大值。一般用户不需要关注这个参数。然而,如果用户的文件系统可以支持大的文件,可以考虑增大该参数值。但增大该参数,会增加压缩与等待间隔的时间。如果你本身就需要操作一个大数据库,也可以适当增大该参数值。
- CompressionType compression:采用特定的压缩算法,对block进行压缩。这个参数可以进行动态修改。CompressionType是枚举型的,目前该枚举类型只有两种值,即kNoCompression与kSnappyCompression。默认值为kSnappy Compression。Snappy是一种轻量且快速的压缩算法。从实际应用上来看,Snappy的压缩速度可显著快于目前磁盘的存储速度,因此一般情况下应该开启压缩模式。如果输入数据不可压缩,Snappy也可以有效地检测并转换到非压缩模式。
- bool reuse_logs:如果reuse_logs为true,将会继续利用已有的Manifest和Log文件进行添加,从而加速数据库的Open操作。
- const FilterPolicy* filter_policy:默认为NULL。如果不为NULL,用户可以指定相应的过滤策略,以减少磁盘读取次数。
2.5.2 读操作参数ReadOptions
ReadOptions主要在DB::Get读操作方法中进行参数传递。其主要参数主要有以下3个。
- verify_checksums:默认值为false,如果设为true,那么当读数据时,会对数据的校验和进行验证,从而保证数据的一致性。
- fillcache_:默认为true。表示在迭代器读取数据时是否将数据缓存在内存中。如果是进行块的扫描,一般可以将该参数设为false。
- snapshot:默认为NULL。如果该参数不为NULL,则会从当前已有的快照中开始读;如果为NULL,在读操作的开始阶段,将会采用一个隐式的状态快照。
2.5.3 写操作参数WriteOptions
WriteOptions主要在DB::Put写操作方法中进行参数传递。目前在写操作中,该参数只有一个,即sync。该参数主要是为了指定调用write方法进行写文件操作时,是否将操作系统缓存区的内容实时同步写入硬盘中。该参数默认为false,因为当宕机发生时,一些写操作必然写入不成功,从而造成数据丢失。而当该参数设置为true时,相当于在write函数操作后调用fsync函数,从而在写操作完成之前,将缓存区的数据强制同步持久化。显然,当该参数设置为true时,写入速度会变慢。