TiKV Contributors day3:
文章目录
成为tikv贡献者第三天:存储引擎
本文是TiKV 源码阅读第三篇,
目标:snapshot进行进一步理解,一边理解rust语法,一边抽象模块之间关系。
阅读完你将收益融如下
- 容易题不丢分,先吃小甜点+1分,增加学习动力 掌握一个语法知识 std::move()实现原理
- 为什么支持传入的是左值还是右值这2个参数是&&原因吗
- 为什么返回的都是右值引用,是static_cast功劳吗?
- forward怎么做到区分类型的,他做不到 还是依赖remove_reference吗?
- 了解rust 用引用 生命周期用法 不管什么raft,什么rockdb,本来不明白,完全当作黑盒, 完全是程序员思维。
回顾:
介绍了PC,KvService,Storage 分层关系 就是就是函数调用关系
Storage 提供了 Snapshot 来提供查询功能
代码位置
- tikv-master\src\storage\mod.rs
- 接口
|
|
rust语法知识
**SnapContext<'_> ,必须看懂这个语法, 看到它其他完全没心情看了,我是偏离主轨道,研究这个语法了 **
- 回顾看看c++怎么处理的:
C++ 没有 Rust 那样的生命周期系统,因此程序员需要更加小心地管引用的生命周期
|
|
- rust怎么处理这个情况
|
|
明白了,
- 在c++中 ref 和 local_string 之间范围关系 在编译时候没有约束
- 在rust 中 result 作用范围 和 s作用范围不一致,编译报错
- 引用的生命周期至少应该与其所指向的值的生命周期相同。
- 通过std::move 理解, T,T&& template<T&&>
|
|
1) 模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值
2STL——萃取机制(Traits)
-
.定义:traits中文意思是特性,它通过提取不同类的共性,使得可以统一处理。
-
技术实现:traits运用显式模板特殊化(模板偏特化,全特化)将代码中因为类型不同而发生变化的片段提取出来,
-
用统一的接口来包装,并通过traits模板类公开的接口间接访问相应的类。
明白了,
-
stl中 value_type 不是变量,类型别名typedef/using
-
std::remove_reference<_Tp>::type 通过作用域 萃取 type
-
模板实例化简单举例 ,
int &&move(int)
int &&move(int &a)
int &&move(int && a)
C++11 typename remove_reference<T>::type(去除传入类型引用符号)-说人话
啥意思 就是获取类T,int
-
别被static_cast误导了,不是static_cast保证了返回的是右值。
- std::forward
|
|
明白了,
类型折叠 简单理解成 语文没有逗号中的断句,商家最终解释权
从样板到最后实例化中间还有过程 这个编译器发挥作用了
rust项目结构
|
|
mod.rs 文件作用
-
tikv-master\src\storage\mod.rs
-
mod.rs
作用定义storage
模块的公共接口和私有实现。-
公共接口:使用
pub
关键字来声明子模块中哪些项是公共的,可以被其他模块访pub mod kv; storage/kv 声明目录下模块被其他模块访
pub mod mvcc; 声明内部子模块是公共的,可以被其他模块
pub mod raw; 声明内部子模块是公共的,可以被其他模块
pub mod txn; 声明内部子模块是公共的,可以被其他模块
类似 c++中 头文件 提供public 函数
use crate::storage::mvcc::MvccReader;
use:类似 c++中 头文件 using namespace std;
crate:路径指定:
crate::storage::mvcc
是MvccReader
所在的路径 -
定义类
pub struct Storage<E: Engine, L: LockManager
tikv-master\src\storage\kv\mod.rs 作用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
kv % tree . ├── mod.rs └── test_engine_builder.rs pub use tikv_kv::*; //引用 tikv_kv模块全部内容 [package] name = "tikv_kv" version = "0.1.0" authors = ["The TiKV Authors"] description = "The key-value abstraction directly used by TiKV" edition = "2018" publish = false
为 什么:storage\kv 没有 任何代码,
pub use tikv_kv::*
类似在C++中,头文件通常用于声明类的接口,包括虚函数,具体实现可能调用其他动态库
1 2 3 4 5 6
class MyClass { public: MyClass(); // 构造函数 virtual ~MyClass(); // 虚析构函数 virtual void myFunction(); // 虚函数 };
tikv_kv是什么
1 2 3 4 5 6 7 8 9 10 11
tikv_kv % tree . ├── Cargo.toml └── src ├── btree_engine.rs ├── cursor.rs ├── lib.rs ├── raftstore_impls.rs ├── rocksdb_engine.rs └── stats.rs
TiKV 支持了三种不同的 KV 存储引擎,
- 单机 RocksDB 引擎、 rocksdb_engine.rs RocksDB 是一个单机的 Key-Value Map。
- 内存 B 树引擎 btree_engine.rs
- RaftKV 引擎
小结
抛开一切概念 ,抛开 一切流程图,反正我是看不懂
终于看到 rocksdb_engine 后面怎么看不清楚,有大神告诉一下吗/
1 2 3 4 5 6 7 8 9 10 11 12
tikv_kv % tree . ├── Cargo.toml └── src ├── btree_engine.rs ├── cursor.rs ├── lib.rs ├── raftstore_impls.rs ├── rocksdb_engine.rs └── stats.rs
-
参考
-
TiKV 源码解析系列文章(十九)read index 和 local read 情景分析
-
TiKV 源码解析系列文章(十)Snapshot 的发送和接收
-
PointGet的一生
-
Rust 参考手册 中文版
-
TiKV RocksDB读写原理整理
-
TinyKV Course: RaftStore执行流程
-
TiDB 技术内幕 – 说存储
-
TiKV 源码解析系列 - Raft 的优化