继续继续...

转眼都开学啦...


Building Blocks 2

building blocks里讲了一些关于Log structure storage的东西,这也是用于在硬盘上持久化KvStore要用的结构。我们边做project边看吧


Project 2

这次要Create a persistent key/value store that can be accessed from the command line,意思就是要写硬盘啦。我们给project2起个名字吧:KVS2.0

Bitcask

我们会使用Building Blocks 2中讲过的Bitcask,这是一种日志型key-value存储模型。Bitcask的核心思想就是把key对应的具体的值存到硬盘上,在写内存的同时维护一个硬盘上的log file(类似RocksDB中的WAL),这样就可以把数据持久化啦。

ref: https://cloud.tencent.com/developer/article/1083737

https://blog.csdn.net/chdhust/article/details/77801890

根据Bitcask的思想,那我们的KVS2.0就这样设计:

KVS2.0要支持以下几种操作(和之前的project1差不多):

  • Set <KEY> <VALUE>

    • 对于不存在的新记录,向log file中存record(注意维护idx++),并在index中存储<key, idx>
    • 对于已存在的新纪录,向log file中存record(还是idx++,旧的先不动),并在index中更新<key, idx>
    • 一个写操作需要进行 一次顺序的磁盘写入 和 一次内存操作。
  • Get <KEY>

    • 先在idex中key对应的idx,然后在log file中找idx对应的value,返回
  • Rm <KEY>

    • 删掉index中的<key, idx>键值对。Log file不动
  • Replay

    • 刚重启程序时index是空的,需要根据log file重建内存中的index
  • compaction:删除log file中无用的块

    • 定期将所有older data file中的数据扫描一遍并生成新的data file(没有包括active data file 是因为它还在不停写入),这里的merge其实就是将对同一个key的多个操作以只保留最新一个的原则进行删除。

另外Bitcask还支持一些特性,但现在我们暂(tou)时(lan)先不实现啦:

  • 当一个log file过大时,另外建立一个新的log file
  • Hint file

Error handeling in rust

因为磁盘io是可能存在错误的(比如硬盘被人跺了一脚),所以这次我们还要考虑rust中的error handeling。

Rust工程的文件结构

project 2和project 1的文件结构很像,唯一不同点就是多了一个error.rs,用于错误处理。

刚上来写好像有种无从下手的感觉....我们不妨先分析一下Brain大神的样例。

BufReader和BufWriter

首先来看最核心的KvStore的结构。它被定义在kv.rs中。之前我们提到要记录log file,假设我们就用一个简单的文本文件作为log(用别的格式比如json也可以,反正原理是一样的),那么它的格式应该是这样的:

idx "key":"val"

比如
"qq": "mahuateng"
"zzz": "qaqaqaq"
"llc": "nbnbnbnbnbnb"
"hfut": "nb666"

其中idx是一个递增的计数器。那么如果我们要在rust中做到能随时定位这个文本文件中的每一行(即每个record),就需要如下信息:

该行在文件中的起始位置
该行在文件中的结束位置
该行记录的长度
该行记录的idx

Rust提供了std::io,这是一个进行io操作的库。为了方便进行文件读写操作,可以定义 BufReaderWithPos 和 BufWriterWithPos 两个结构体:

struct BufReaderWithPos<R: Read + Seek> {     //BufReaderWithPos可以同时作用在Read和Seek两种trait上
reader: BufReader<R>, //读缓冲区
pos: u64, //当前读位置的指针
}
BufReaderWithPos实现了read和seek函数。
new时会用给定的文件(File)初始化BufReader。seek时将文件定位到指定的位置。 struct BufWriterWithPos<W: Write + Seek> { //BufWriterWithPos可以同时作用在Write和Seek两种trait上
writer: BufWriter<W>, //写缓冲区
pos: u64, //当前写位置的指针
}
BufReaderWithPos实现了write,seek,flush函数。
new时会用给定的文件(File)初始化BufWriter。

这样我们就有了对文件进行读写的工具。

KvStore

接下来看最主要的struct:KvStore。里面的成员变量如下:

pub struct KvStore {
// directory for the log and other data
path: PathBuf, // map generation number to the file reader
// 一条记录的idx->它在log file中的位置,用于读记录
readers: HashMap<u64, BufReaderWithPos<File>>, // writer of the current log
// 用于写记录
writer: BufWriterWithPos<File>, current_gen: u64, //
index: BTreeMap<String, CommandPos>, // the number of bytes representing "stale" commands that could be deleted during a compaction
uncompacted: u64,
}

这里我们重点关注这两个HashMap。

1

Rust学习笔记2的更多相关文章

  1. Rust学习笔记1

    这是一份不错的rust教程,目前包括4个block和4个project.全部完成后可以用rust实现一个简单的key-value存储引擎. 注意:Windows下rust貌似会遇到一些bug,强烈建议 ...

  2. Rust学习笔记一 数据类型

    写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差. 自学了Java.Kotlin.Python. ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. 结合webpack实现children子路由,抽离路由模块

    demo结构 package.json.webpack.config.js.index.html与上一篇博客相同. main.js // 这是项目的入口js文件 // import $ from 'j ...

  2. vue学习-day02(自定义指令,生命周期)

    目录: 1.案例:品牌管理    2.Vue-devtools的两种安装方式    3.过滤器,自定义全局或私有过滤器    4.鼠标按键事件的修饰符    5.自定义全局指令:让文本框获取焦点   ...

  3. java HTTP文件断点上传

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  4. ASP.NET MVC 生成EML文件

    需求: 点发送邮件按钮的时候, 自动在客户端电脑打开默认邮件的窗口,并且把内容和附件都附加上去. 解决方案: 尝试使用过Microsoft.Office.Interop.Outlook 和 MPAI. ...

  5. 苹果cms怎么上传本地视频资源

    今天我们来简单分享下苹果cms怎么上传本地视频,采集资源站的资源我们已经熟知了,但是有的伙伴们想要上传自己制作或是录制的视频应该怎么操作呢?这个问题有多种方法,今天我们先简单的说2种方法. 一,上传到 ...

  6. 数据科学20个最好的Python库

    Python 在解决数据科学任务和挑战方面继续处于领先地位.去年,我们曾发表一篇博客文章 Top 15 Python Libraries for Data Science in 2017,概述了当时业 ...

  7. Oracle升级11.2.0.3-11.2.0.4(Windows)

    背景:解决11.2.0.3带来的ora-08103错误,将数据库seinescm升级到11.2.0.4版本方法:另辟路劲安装11.2.0.4版本数据库软件,再对现有的数据库进行升级步骤:1.    检 ...

  8. android 3.0 ationbar使用总结

    1,ationbar的基本讲解 http://www.apkbus.com/forum.php?mod=viewthread&tid=125536 仅仅需要根据需求写出一个menu资源文件 2 ...

  9. [LeetCode]-DataBase-Rising Temperature

    Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...

  10. Spring Security 报There is no PasswordEncoder mapped for the id "null"

    查了下发现是spring security 版本在5.0后就要加个PasswordEncoder了 解决办法 在securityConfig类下加入NoOpPasswordEncoder,不过官方已经 ...