2021年4月2日星期五

rocksdb代码解析-db.h

  这篇是对rocksdb整体功能的分析,主要着眼点是db.h文件,对rocksdb进行代码解析,若想以整体的方式了解其功能,首先就应该解析db.h文件。对于rocksdb的db.h文件来说,且不论前面一大串结构体,该文件的核心无疑是class DB,从一百多行到一千多行,都是这个类。

  本文共计七千余字,分为四个部分,分别是整体方法,属性方法,参数解析和其他。

  下面对类内部进行分析,为了节约空间,函数参数不再写了。

整体方法

  该表格为整体性方法,主要操作包含Put,Get,Delete等键值存储的基础操作以及针对数据库本身的操作,还有就是rocksdb自身的扩展。

Open用指定的"name"【引用型字符串参数】打开数据库【默认列族】。在* dbptr中存储指向堆分配的数据库的指针,并在成功时返回OK。将nullptr存储在* dbptr中,并在出现错误时返回非OK状态。当不再需要* dbptr时,调用者应将其删除(delete DB)。返回值直接给db就行,一般来说数据库只用有一个,如果想分类使用列族的方式会快很多。
OpenForReadOnly以只读形式打开数据库,此时不考虑列族的问题,像删改一样的改数据的操作都会返回错误,且不会触发compaction操作。
OpenForReadOnly以只读模式打开某列族(或某些),用参数与上面的玩意区分,列族名存在vector数组中。只能打开指定的列族,如果不写指定列族的参数的话,会对默认列族进行操作。默认列族存在 kDefaultColumnFamilyName 里面,可以自行修改。假如想对n个列族进行操作的话,应该创建n-1个列族。
OpenAsSecondary

从节点功能,该方法创建了一个从节点,可以动态地追踪现有的MANIFEST文件。用户可以在需要时调用TryCatchUpWithPrimary使备份追上主节点。主节点优先级大于从节点,启动从节点的话只要主节点的句柄没有被销毁,还是可以恢复到主节点状态的。

options参数指定用于打开从节点的选项。

name参数指定用于打开主节点的主数据库的名称。

secondary_path参数指向从节点存储其信息日志的目录。

dbptr是与打开的从节点相对应的out-arg【外部指针】该指针指向一个堆中数据库,用户应在使用后将其删除。

目前不支持WAL追踪【实时从节点】,但很快就会有。

OpenAsSecondary上面的方式会以默认列族打开,而这个会指定列族的方式打开从节点,多了一个参数就是column_families,这个参数指定要打开的列族。【所谓从节点可以以MVCC的多版本控制链来理解】
Open

以列族打开数据库,用参数和上面的区分

实际上在进入代码研究之后可以发现列族不管你指不指定都必须有,不输入的话就是默认的列族。

db_options指定数据库特定的选项

column_families是数据库中所有列族的向量,包含列族名称和选项。

->可以用ListColumnFamilies()来获得所有列族的列表。也可以用只读的方式打开部分列族。

默认的列族名为default,存储在rocksdb::kDefaultColumnFamilyName.

如果没问题的话,返回时句柄的大小将与column_families相同-->handles [i]将是用于对列族column_family [i]进行操作的句柄。

用这种函数打开的数据库要删除的话需要用DestroyColumnFamilyHandle()来删除所有句柄。
Resume数据库恢复操作,与最下面的数据库修复操作不同,这个是针对备份与主存的。
Close关闭数据库,包括释放资源,清理文件等操作。为了防止意外,此方法应该在析构函数之前调用,并且若数据库中还有没释放的闪照的话会返回失败。
ListColumnFamilies这个方法会将打开指定参数名的数据库,并通过column_families参数返回该数据库中所有列族的列表。
CreateColumnFamily创建column_family并通过参数handle返回列族的句柄,通过status返回是否成功。
CreateColumnFamilies批量创建具有相同列族选项设置的列族。该函数可能会出现部分成功部分失败的情况,成功的状态会保留。
CreateColumnFamilies这个也是批量创建列族的,与上面不同的是上面的是全部相同属性的列族,传入的参数是字符串作为列族名。而这个通过列族描述符传入,每个列族属性都可能不同。
DropColumnFamily通过句柄指针删除一个列族,此调用仅在mainfest中记录一个删除记录,并防止刷新和压缩列族。
DropColumnFamily批量删除列族,此调用仅在mainfest中记录一个删除记录,并防止刷新和压缩列族。如果发生错误,请求可能会部分成功。用户可以调用ListColumnFamilies来检查结果。
DestroyColumnFamilyHandle

关闭由column_family句柄指定的列族,并销毁指定的列族句柄,以避免重复删除。默认情况下,此调用将删除列族句柄。注意:请使用此方法关闭列族而不是直接删除列族句柄。

Put

kv存储最基础的操作之一,Slice格式的输入,通过参数判断是否指定列族,最后会以write_batch的形式写入。更新操作也是通过Put来实现的。

Deletekv存储最基础的操作之一,通过key删除,如果key不存在也不会报错,因为其本质上来说也是插入操作,Put的key带有delete标记,在后续的compaction中会删除掉前面的内容。
SingleDelete通过key删除.要求key存在并且未被覆盖。如果key不存在也不会报错。如果key被overwrite(更新)了,那么调用这个会返回undefined,自从上次对该key调用SingleDelete()以来,只有该key只有一个Put()时,SingleDelete()才能正确运行。【库内只允许一条记录】-->删除方法只删除最新的,所以不能有多个记录。当前,此功能是针对非常特定的工作负载的实验性性能优化。调用者应确保SingleDelete仅用于未使用Delete()删除【因为delete本质也是put】或未使用Merge()写入的key。将SingleDelete操作与Deletes和Merges混合使用会导致不确定的行为。
DeleteRange

按range:"begin_key", "end_key"删除数据,但在生产实践中一般不用这个。

原因:1.在内存表中累积许多范围的逻辑删除将降低读取性能。(可以通过偶尔手动flush来避免这种情况。)2.在存在范围逻辑删除的情况下限制打开文件的最大数量会降低读取性能。(为避免此问题,请尽可能将max_open_files设置为-1。也就是不限制。)
MergeMerge操作,此操作简单来说就是rocksdb对于对已存在数据库中的value进行追加的一个操作,比如使key1对应的value->hello变成helloworld。对这个操作进行的算法优化。此操作包括'读-改-写'三个步骤。打开DB时,此操作的语义由用户提供的merge_operator决定,实际上是决定其在后来的compaction过程中的合并方式。
Write将指定的更新应用到数据库。如果'updates'不包含更新,但options.sync = true【是否同步】,WAL仍将同步。
Getkv存储最基础的操作之一,按key查找,不影响value。找不到返回Status::IsNotFound(),其他错误会返回其他Status。Get操作首先在内存中的表进行查询(首先是缓存,然后是memtable等内存表),在查询无果后会向下面的持久化存储LSM-tree进行逐层查询。
GetMergeOperands返回与键对应的所有合并操作数。operands【操作数】,这里是指对步骤进行拆解后需要的操作的数量
MultiGet顾名思义,一次性get多个,以参数来看是以向量作为数组传递Slice格式的参数。如果keys [i]在数据库中不存在,则第i个返回的状态将为Status :: IsNotFound()为true的状态,并且(* values)[i]将被设置为某个任意值(通常就是 "")。否则,第i个返回的状态将具有Status :: ok()为true,并且(* values)[i]将存储与keys [i]关联的值。
MultiGet重载的MultiGet API通过在读取路径中进行批处理操作来提高性能,从而提高效率。但仅支持具有完整过滤器的基于block的表格式。
KeyMayExist用于判断一个key是否存在,如果key在数据库中不存在,则返回false,否则返回true。如果调用者想在内存中找到key时获取value,则必须设置"value_found"为true。【默认false】与调用DB::Get()相比,这个方法更加轻量【消耗资源少(why:IO少了)】。
NewIterator创建迭代器,返回基于堆的数据库迭代器。NewIterator()的结果最初是无效的(调用者必须在使用迭代器之前在迭代器上调用Seek方法之一)。如果不是长时间使用,调用者请删除迭代器。在删除此数据库之前,应删除返回的迭代器。若是只传入读选项的话,会对默认列族操作,传入列族指针或是列族数组的话可以跨列族操作。另外,迭代器是堆分配的,需要在删除数据库之前将其删除。
GetSnapshot返回当前数据库状态的句柄【快照】,使用此句柄创建的迭代器都将观察当前数据库状态的稳定快照。当不再需要快照时,调用者必须调用ReleaseSnapshot(result)来释放快照。如果数据库无法进行快照或不支持快照,则将返回nullptr。
ReleaseSnapshot释放快照,注意释放后请不要再次建立快照。

 

参数

  结构体Propertiy里包含了所有有效的属性参数,这些参数通过GetProperties()获取,这些属性能在多维度反应数据库当时的运行状态。当然,底层的具体架构分布是不显示的,要是想了解的话【以db_bench为例】可以在系统的tmp文件夹里找到rocksdb开头的文件夹,在里面可以看到运行日志,具体的sst文件以及数据库参数选项的设置之类的东西,建议了解了解。其中数据库参数选项(options)的设置很大程度上决定了数据库的发挥,参数可以在相关文件中修改【不推荐】,也可以在运行时调用相关接口进行修改,或者在运行数据库时作为外部参数传入。

    

kNumFilesAtLevelPrefix

返回包含文件在第几层的字符串,用ASCII表示。

kCompressionRatioAtLevelPrefix

返回包含在第N层的压缩率的字符串,用ASCII表示。在这里压缩率被认为是-未压缩的数据大小/压缩的文件大小。没有文件的话返回"-1.0"。

kStats

返回多行字符串,其中包含kCFStats描述的数据,后跟kDBStats描述的数据。

kSSTables

返回总结当前SST文件的多行字符串

kCFStats

相当于 "rocksdb.cfstats-no-file-histogram" 和"rocksdb.cf-file-histogram" 加起来. 具体见后面的描述【histogram直方图】

kCFStatsNoFileHistogram

返回一个多行字符串,该字符串在db的生命周期(" L <n>")内具有每层的常规列族统计信息,在db的生命周期(" Sum")内进行聚合,并在自上次检索以来的时间间隔(" Int")进行聚合 。它还可以用于以映射的格式返回统计信息。在这种情况下,每个级别以及"sum"都将有一对字符串组成双精度数组。检索这种形式的统计信息时,"int"统计信息将不会受到影响。

kCFFileHistogram

输出每层读取了多少文件,以及单个请求的延迟的直方图。

kDBStats

返回包含常规数据库统计信息的多行字符串,该统计信息既是累积的(在数据库的生命周期内),又是间隔的(从上一次检索kDBStats开始)。

kLevelStats

返回多行字符串,其中包含每层的文件数和每个级别的总大小(MB)。

kNumImmutableMemTable

返回尚未flush的immutable memtables数量。

kNumImmutableMemTableFlushed

返回已经准备好flush的immutable memtables数量。

kMemTableFlushPending

如果memtable flush挂起,则返回1; 否则,返回0。

kNumRunningFlushes

返回正在flush的table的数量

kCompactionPending

如果至少有一个compaction正在挂起,则返回1,否则0

kNumRunningCompactions

返回正在compaction的数量

kBackgroundErrors

返回后台错误的统计

kCurSizeActiveMemTable

返回活动的memtable的近似大小(字节)

kCurSizeAllMemTables

返回活动的memtable和未flush的immutable memtable的近似大小(字节)。

kSizeAllMemTables

返回活动的memtable,未flush和已flush的immutable memtable的近似大小(字节)。

kNumEntriesActiveMemTable

返回活动memtable中的条目总数。

kNumEntriesImmMemTables

返回未flush的immutable memtable中的条目总数。

kNumDeletesActiveMemTable

返回活动memtable中删除条目的总数。

kNumDeletesImmMemTables

返回未flush的immutable memtable中删除条目的总数。

kEstimateNumKeys

返回memtable和未flush的immutable memtable和持久化存储中的总键的估计数量。

kEstimateTableReadersMem

返回用于读取SST表的估计内存,不包括块缓存中使用的内存(例如过滤器和索引块)。

kIsFileDeletionsEnabled

如果启用了删除过时的文件,则返回0,否则,返回一个非零数字。

kNumSnapshots

返回数据库内没释放的闪照的数量

kOldestSnapshotTime

返回表示最旧的未发布快照的Unix时间戳的数字。

kNumLiveVersions

返回现存的version数。 "version"是一个内部数据结构,细节在version_set.h里面更多的现存的版本通常意味着更多的SST文件没有被删除(来自迭代器或未完成的压缩)。

kCurrentSuperVersionNumber

返回当前LSM版本号它是一个uint64_t整数,在LSM树发生任何更改后递增。重新启动数据库后,该号码不会保留,从0开始。

kEstimateLiveDataSize

返回以字节为单位的实时数据量的估计值

kMinLogNumberToKeep

返回应保留的日志文件的最小日志数

kMinObsoleteSstNumberToKeep

返回保留过时的SST的最小文件号。如果可以删除所有过时的文件,则将返回`uint64_t`的最大值。

kTotalSstFilesSize

返回所有SST文件的总大小(字节)。如果文件太多,可能会降低在线查询的速度。

kLiveSstFilesSize

返回属于最新LSM树的所有SST文件的总大小(字节)。

kBaseLevel

返回将L0数据压缩到的层数

kEstimatePendingCompactionBytes

返回估计的重写压缩总数,以使所有级别降至目标大小以下。不适用于除基于层以外的其他压缩。

kAggregatedTableProperties

返回目标列族的聚合表属性的字符串表示形式。

kAggregatedTablePropertiesAtLevel

和前面的一样,但只针对第N层

kActualDelayedWriteRate

返回当前的实际延迟写入率。0表示没有延迟。

kIsWriteStopped

判断写入状态,如果写入已停止,则返回1。

kEstimateOldestKeyTime

返回数据库中最旧的密钥时间戳的估计值。目前仅适用于FIFO压缩中,且要求compaction_options_fifo.allow_compaction = false。

kBlockCacheCapacity

返回块缓存容量

kBlockCacheUsage

返回驻留在块缓存中的条目的内存大小

kBlockCachePinnedUsage

返回被挂起【固定】【pinned】的kv对的内存大小。

kOptionsStatistics

返回对options.statistics的描述,为多行字符串

 

   接下来是有关属性的函数:

GetProperty

数据库实现可以通过此方法导出有关其状态的属性。如果"属性"是此数据库实现可以理解的有效属性(有关有效属性,请参见上面的属性结构)

GetMapProperty

同上,获得属性及其相应的映射关系

GetIntProperty

和上面的GetProperty()类似,但仅适用于返回值为整数的属性子集。

GetAggregatedIntProperty

与 GetIntProperty()相同,但是此函数返回所有列族的聚合int属性。

ResetStats

重置数据库和所有列族的内部统计信息。请注意,这不会重置options.statistics,因为它不属于数据库

GetApproximateSizes

这个返回的是实际上大致的大小,如果用户数据压缩十倍,则返回的大小将是相应用户数据大小的十分之一。

GetApproximateMemTableStats

该方法与GetApproximateSizes相似,不同的是它返回内存表中的记录的大致数量。

CompactRange

压缩键范围[* begin,* end]的基础存储。实际压缩间隔可能是[* begin,* end]的超集。特别是删除和覆盖的版本将被丢弃,并对数据进行重新排列以减少访问数据所需的操作成本。通常,只有对基础有一定了解的用户才能调用此操作。特别的,begin==nullptr 视为数据库中所有key之前的key,end==nullptr 视为数据库中所有key之后的key。因此,以下调用将压缩整个数据库:db->CompactRange(options, nullptr, nullptr); 请注意,在压缩整个数据库之后,所有数据均被下推到包含任何数据的最后一级。如果压缩后的总数据大小减小,则该级别可能不适用于存储所有文件。在这种情况下,客户端可以将options.change_level设置为true,以将文件移回能够容纳数据集的最小级别或给定级别(由非负options.target_level指定)。

SetOptions/SetDBOptions

顾名思义,对数据库选项进行设置,不在乎先后顺序,只需将内容以vector数组的形式传入。

CompactFiles

CompactFiles()输入由文件编号指定的文件列表,并将其压缩到指定层。该行为与CompactRange()的不同之处在于CompactFiles()使用CURRENT线程执行压缩作业。也就是'立即进行'。

PauseBackgroundWork

暂停功能,该功能将一直等到所有当前正在运行的后台进程完成,返回后,将不会运行任何后台进程(compaction,batch,flush之类的操作),直到调用ContinueBackgroundWork

ContinueBackgroundWork

继续整个数据库的运行,由于停止之前就是将正在运行的后台任务运行完才暂停的,所以不会有任务进行到一半接着来的情况。

EnableAutoCompaction

如果先前禁用了给定的列族,此功能将启用它们的自动压缩。【咋禁用的:通过SetOptions()API将disable_auto_compactions设置为'true'】

DisableManualCompaction

EnableManualCompaction

开启和关闭手动compaction,很明显,禁用以后就不能用户主动调用compaction操作了。实际上若是对于rocksdb了解不足的话并不建议开启。

NumberLevels

获取此数据库使用的层数。【当前最高层数】

MaxMemCompactionLevel

如果新的压缩内存表不产生重叠,则将其推送到的最高层。

Level0StopWriteTrigger

level0中将停止写入的文件数。不给列族参数的话就对默认列族操作。

GetName

获取数据库名字 -- 与提供给DB :: Open()的参数完全相同的名称

GetEnv

从数据库获取环境对象,rocksdb和leveldb一样将系统环境以对象的形式处理。

GetOptions

获取我们对数据库设置的选项。

Flush

flush操作,也是rocksdb和leveldb的区别之一,将所有memtable内容flush到磁盘,自动flush开启时会自动flush单个列族的内容,要是想flush多个列族,需要用Flush(options, column_families).

FlushWAL

将WAL内存缓冲区刷新到文件.如果sync为true,则此后将调用SyncWAL。

SyncWAL

同步WAL。 请注意,后面带有SyncWAL()的Write()与带有sync = true的Write()并不完全相同:在后一种情况下,直到完成同步,更改才可见。当前仅在"选项"中的allow_mmap_writes = false时有效。

LockWAL/ UnlockWAL

对WAL加锁,解锁。上锁后flushWAL的内容。

SequenceNumber

最近转换的序列号,每次实际的key传入都会使该值加一。

SetPreserveDeletesSequenceNumber

指示数据库保留序列号> =传递的seqnum的删除。如果DBOptions.preserve_deletes设置为false,则无效。该函数假定用户使用单调递增的seqnums调用此函数(否则我们不能保证某些特定的删除操作已被处理);数据成功更新后返回true,如果用户尝试调用seqnum <=当前值,则返回false。

DisableFileDeletions

防止文件删除。 压缩将继续发生,但是不会删除任何过时的文件。调用这玩意多次和调用这玩意一次的效果是一样的。

EnableFileDeletions

允许压缩删除过时的文件。

如果force==true,则即使之前多次调用DisableFileDeletions(),对EnableFileDeletions()的调用也将确保在调用之后启用文件删除。

如果force == false,则EnableFileDeletions仅在被调用至少与DisableFileDeletions()相同的次数之后才启用文件删除,使两个线程可以同时调用两个方法而无需同步-即仅在两个线程都调用EnableFileDeletions()之后,才启用文件删除

GetLiveFiles

GetLiveFiles后跟GetSortedWalFiles可以生成无损备份

--检索数据库中所有文件的列表。

这些文件是相对于dbname的,不是绝对路径。尽管是相对路径,但文件名以" /"开头。

manifest文件的有效大小在manifest_file_size中返回。 manifest是一个不断增长的文件,但是只有manifest_file_size指定的部分对此快照有效。

将flush_memtable设置为true会在记录【recording】活动文件之前进行刷新。当我们不想等待刷新时,可以将flush_memtable设置为false,因为刷新可能需要等待压缩才能完成,需要花费不确定的时间。

如果您有多个列族,即使flush_memtable为true,您仍然需要在GetLiveFiles之后调用GetSortedWalFiles,以补偿在刷新其他列系列时到达已经刷新的列系列的新数据

GetSortedWalFiles

首先检索最早文件的所有wal文件的排序列表

GetCurrentWalFile

检索有关当前wal文件的信息

请注意,该调用之后日志可能已经滚动,在这种情况下current_log_file不会指向当前日志文件。

另外,为了优化起见,current_log_file-> StartSequence将始终设置为0

GetCreationTimeOfOldestFile

检索数据库中最旧文件的创建时间。仅当max_open_files = -1时,此API才有效,否则返回的Status为Status :: NotSupported()使用提供给数据库的环境设置文件创建时间。

如果数据库是从非常老的发行版创建的,则SST文件可能不具有file_creation_time属性,甚至在移至更新发行版之后,也有可能某些文件从未压缩过并且可能不具有file_creation_time属性。

在这两种情况下,file_creation_time都被视为0,这意味着该API将返回creation_time = 0,因为时间戳不会低于0。

GetUpdatesSince

注意:此API尚未与WritePrepared事务保持一致。

将iter设置为位于包含seq_number的写批处理中的迭代器。如果序列号不存在,则在请求的seq_no之后的第一个可用seq_no处返回迭代器。如果迭代器有效,则返回Status :: OK必须将WAL_ttl_seconds或WAL_size_limit_MB设置为较大的值才能使用此api,否则WAL文件将被积极清除,并且迭代器可能会在读取更新之前变得无效。

DeleteFile

从db目录中删除文件名,并更新内部状态以反映该状态。

---仅支持删除sst和日志文件。

--- "名称"必须是相对于db目录的路径。 例如。 000001.sst,/ archive / 000003.log

GetLiveFilesMetaData

返回所有表文件的列表及其level,开始key和结束key

GetColumnFamilyMetaData

获取数据库指定列系列的元数据,不指定列族的话会获取默认列族的元数据。

IngestExternalFile

IngestExternalFile()会将外部SST文件加载到数据库中,支持两种主要模式:

(1)新文件中的重复密钥将覆盖现有密钥(默认)

(2)重复的键将被跳过(设置为ingest_behind = true)

在第一种模式下,我们将尝试找到文件可以容纳的最低level,并将文件提取到该level。key范围与内存表key范围重叠的文件将要求我们在提取文件之前先刷新该内存表。

在第二种模式下,我们将始终在最底层level进行摄取

 另: (1) 可以使用SstFileWriter创建外部SST文件。(2) 即使文件压缩与级别压缩不匹配,我们也会尝试将文件提取到最低级别 (3) 如果将IngestExternalFileOptions-> ingest_behind设置为true,我们总是在最底层进行摄取,为此,应该保留该最低层(请参阅DBOPtions :: allow_ingest_behind标志)。

IngestExternalFiles

IngestExternalFiles()将提取多个列族的文件,并将结果自动记录到MANIFEST中。如果此函数返回OK,则必须成功完成所有列族的提取。如果此函数返回其他的,或者进程崩溃,则恢复后,非文件将被提取到数据库中。

注意,在执行此功能期间,应用程序可能会观察到混合状态。如果用户使用迭代器对列族执行范围扫描,则一个列族上的迭代器可能返回提取的数据,而另一列族上的迭代器则返回旧数据。

用户可以使用快照来获得一致的数据视图。如果您的数据库使用此API提取了多个SST文件,即args.size()> 1,则RocksDB 5.15和更早版本将无法打开它。

要求:每个arg对应于一个不同的列族:即,对于0 <= i <j <len(args),args [i] .column_family!= args [j] .column_family。

CreateColumnFamilyWithImport

CreateColumnFamilyWithImport()将使用column_family_name创建一个新的列族,并将元数据中指定的外部SST文件导入该列族。

 (1) 可以使用SstFileWriter创建外部SST文件。

 (2) 可以从现有数据库中的特定列族导出外部SST文件。

import_options中的Option指定是复制还是移动外部文件(默认为copy)。

如果选项指定复制,则在external_file_path中管理文件是调用者的责任。当option指定移动时,调用将确保成功返回时删除external_file_path中的指定文件,并且不会在任何错误返回时修改文件。返回错误时,返回的列族句柄将为nullptr。成功返回时将出现ColumnFamily,而错误返回时将不存在。在此调用过程中,任何崩溃都可能存在ColumnFamily。

AddFile

直接导入文件的方式,这种方式已经被弃用,请使用上面的方式。

GetPropertiesOfAllTables

获得所有表的特征描述

SuggestCompactRange

参数为列族名和起始的key,可以获得建议的压缩范围

StartTrace/EndTrace

开始/停止数据库的跟踪操作

StartBlockCacheTrace

EndBlockCacheTrace

开始/停止跟踪块缓存访问

GetStatsHistory

给定一个时间范围[start_time,end_time),设置一个StatsHistoryIterator来访问统计历史记录。

TryCatchUpWithPrimary

使备份尽可能的与主存同步

   至此,class DB的内容结束,下面是有关数据库的两个函数

DestroyDB

销毁指定数据库的内容。使用此方法时要非常小心。

RepairDB

如果无法打开数据库,则可以尝试调用此方法以尽可能多地修复数据库的内容。某些数据可能会丢失,因此在包含重要信息的数据库上调用此函数时要小心。使用此API,我们将警告并跳过与column_families中未指定的列系列相关的数据。

  db.h文件的内容到此结束,主要有数据库整体的各种操作,包括列族相关,节点相关,数据库基础相关,以及rocksdb特有的一些操作。另外还可以实时的查看当前数据库的运行状态,通过GetProperties获取相关返回值。最后还有一些数据库通用的操作的rocksdb版本,不得不说rocksdb的功能实现的有点全面的过分了。

 









原文转载:http://www.shaoqun.com/a/661730.html

跨境电商:https://www.ikjzd.com/

韩蓬:https://www.ikjzd.com/w/1635

epc:https://www.ikjzd.com/w/488


总  这篇是对rocksdb整体功能的分析,主要着眼点是db.h文件,对rocksdb进行代码解析,若想以整体的方式了解其功能,首先就应该解析db.h文件。对于rocksdb的db.h文件来说,且不论前面一大串结构体,该文件的核心无疑是classDB,从一百多行到一千多行,都是这个类。  本文共计七千余字,分为四个部分,分别是整体方法,属性方法,参数解析和其他。  下面对类内部进行分析,为了节约空
名人堂是什么:https://www.ikjzd.com/w/1082
patpat:https://www.ikjzd.com/w/1079
e邮包:https://www.ikjzd.com/w/594.html?source=tagwish
2019年中国卖家欧洲站的风险与机遇:https://www.ikjzd.com/home/16246
亚马逊毁了美国零售业?美国财政部长炮轰亚马逊!:https://www.ikjzd.com/home/102315
ProductBoost:https://www.ikjzd.com/w/250

没有评论:

发表评论