首页 > 关于 Rocksdb 的 EnvWrapper 作用的小讨论

关于 Rocksdb 的 EnvWrapper 作用的小讨论

临下班前一位做引擎的小伙伴提了个小问题, Rocksdb 实现了非常多的Env backend

在这里插入图片描述

这一些backend 可以让用户根据自己需求创建不同 公共接口backend,来实现自己的文件操作或者公共线程池操作。

Env* env = new rocksdb::HdfsEnv(FLAGS_hdfs)

问题是,为什么Rocksdb 这里又多实现了一个EnvWrapper 类,class EnvWrapper : public Env,其将Env 几乎所有的成员函数都用默认方式overrie了一遍,有必要吗?

因为 Env的类中除了Env* Default() 之外的函数成员很多都已经是纯虚函数了,它已经可以作为一个抽象类,来用其子类初始化该Env就可以了,那实现的这个EnvWrapper 中每一个函数都掉用一次Env 基类 的对应实现完全没有意义呀,想要实现自己的子类是不是只需要继承一下Env 基类就可以了,为什么还需要单独增加这两百多行代码?

大概看了一下 Rocksdb 内部是如何使用EnvWrapper

在这里插入图片描述

可以看到有非常多的实现使用EnvWrapper,而在该类实现之前的注释中可以很清晰得看到EnvWrapper的作用:

  1. 如果是只有Env 这个基类,那用户实现自己的bakend 的时候就需要将里面所有的纯虚函数都实现一遍,这对很多用户来说代价太高,有可能他们只想修改其中一小部分函数,但却要将所有的纯虚函数override一遍。

    比如这个NoSleepEnv 只想要实现其中的几个自己想用的函数就可以了,不需要受C++ 面向对象语法的约束了。

    在这里插入图片描述

  2. Rocksdb 官方在Env 中增加了一些非常有用的纯虚函数,对于用户来说(继承EnvWrapper 的用户),自己不需要修改任何代码就可以直接使用。

    比如,开发者在Env 基类中增加了一个virtual Status DisablePageCache() = 0 函数,同时同步到EnvWrapper中,这种情况下其他继承自EnvWrapper 统一类的用户不需要修改自己的任何代码,就可以直接使用在这个函数。否则,直接继承Env 实现自己的类的话 任何Env的改动都需要用户修改自己的代码。

可见,Rocksdb 社区代码细节上都是站在接口的易用性、可扩展性、可维护性来实现的。最大程度得降低用户使用Rocksdb 过程中的维护成本,实在是需要我们多多学习。。。。。。

更多相关:

  • //最直接一行代码搞定---------------------------------------- '实现每间隔10个字就换行一次,多用于echarts横坐标的显示文本'.replace(/(.{10})/g,'$1 ')//灵活的方法实现任意字符插入---------------------------------------...

  • 文章目录1. 基本事务操作1.1 TransactionDB -- Pessimistic1.2 OptimisticTransactionDB1.3 Read Uncommitted1.4 SavePoint 回滚部分事务操作1.5 SetSnapshot1.6 GetForUpdate1.7 RepeatableRead2. 实现...

  • 文章目录实验要求Leader Election流程 及详细实现介绍基本角色关键超时变量关键的两个RPC实现RequestVote RPCAppendEntries RPCGo并发编程实现leader election调度...

  • 文章目录前言使用方式实现原理总结...

  • 文章目录1. 基本介绍2. 两种接口使用及简单性能对比3. DeleteRange 的基本实现3.1 写流程的实现3.2 读流程的实现 -- skyline算法...

  • 草色新雨中, 松声晚窗里。之前我们学习 Power Query 都是用鼠标就完成了很多复杂的操作。虽然 PowerQuery 已经将大部分常用功能内置成到功能区。基本能完成我们大部分的报表自动化功能。但是总有些复杂的或者个性化的问题是开发团队没有预先想到的,这时我们就需要学习 M 语言。一、M 语言在哪里?M语言的函数公式有三个地...

  • 前言从2020年3月份开始,计划写一系列文档--《小白从零开始学编程》,记录自己从0开始学习的一些东西。第一个系列:python,计划从安装、环境搭建、基本语法、到利用Django和Flask两个当前最热的web框架完成一个小的项目第二个系列:可能会选择Go语言,也可能会选择Vue.js。具体情况待定,拭目以待吧。。。基本概念表达式表...

  • 1.1函数1.1.1什么是函数函数就是程序实现模块化的基本单元,一般实现某一功能的集合。函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能,进行一系列的逻辑运算return 返回值:函数的返回值能表示函数的运行结果或运行状态。1.1.2函数的作用函数是组织好的,可重复使用的,用来...

  • 原标题:基于Python建立深度神经网络!你学会了嘛?图1 神经网络构造的例子(符号说明:上标[l]表示与第l层;上标(i)表示第i个例子;下标i表示矢量第i项)单层神经网络图2 单层神经网络示例神经元模型是先计算一个线性函数(z=Wx+b),接着再计算一个激活函数。一般来说,神经元模型的输出值是a=g(Wx+b),其中g是激活函数(...

  • 在学习MySQL的时候你会发现,它有非常多的函数,在学习的时候没有侧重。小编刚开始学习的时候也会有这个感觉。不过,经过一段时间的学习之后,小编发现尽管函数有很多,但是常用的却只有那几个。今天小编就把常用的函数汇总一下,为大家能够能好的学习MySQL中的函数。MySQL常使用的函数大概有四类。时间函数、数学函数、字符函数、控制函数。让我...