Rust -- 快速配置 Rust 开发环境并编写一个小应用
1. 安装 Rust你可以在 Rust 演练场上在线试用 Rust 而无需在计算机上安装任何东西。
无需安装,直接尝试 RUST
本文系统环境:CentOS 8.2,其他非类 Unix 系统不适用本文。
1.1 Rustup: Rust 安装器和版本管理工具安装 Rust 的主要方式是通过 Rustup 这一工具,它既是一个 Rust 安装器又是一个版本管理工具。
1curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
然后 Rustup 就都安装完成了。
这里说下 $HOME/.cargo/bin,也就是 ~/cargo/bin 这个目录。在 Rust 开发环境中,所有工具都安装在 ~/.cargo/bin 目录中,你可以在这里找到包括 rustc、cargo 和 rustup 在内的 Rust 工具链,所以 Rust 开发者通常会将该目录加入 PATH 环境变量(上面的安装程序已经替我们做好了这件事)。但由于不同平台、命令行 Shell 之间存在差异,rustup 中也可能存在 Bug,因此 ...
C++11 chrono 高精度计时方法
在学习或开发中,给一段代码计时是一个非常常用的操作。在 C++11 以前,类似 time 库等方法的精度是比较低的,C++11提供了一个精度最高为纳秒级的时间库 chrono。这篇文章给大家演示如何用 chrono 给一段代码计时。
使用 chrono 需要引入 C++11 提供的库:
#include <chrono>
chrono 没有像大多 C++ 标准库一样,把库中所有元素都直接放在命名空间 std 中,而是把绝大部分库中元素都放在了 std::chrono 命名空间中,所以在使用 chrono 时,如果你引用的库中内容比较多,也可以考虑直接 using namespace,本文为了更清晰的演示各个元素的位置,没有 using namespace。
本文主要针对使用 chrono 高精度计时,所以只讲用法,不讲原理,同时对 chrono 提供的其他功能也不作解释。
想一想计时的常规思路是什么!1. 记录被计时的代码段开始前的时间点;2. 执行被计时的代码段;3. 被计时的代码段执行完后,记录其结束时的时间点;4. 用被计时代码段结束时的时间点与开始前的时间点 ...
致访客
欢迎大家来到我的博客,希望在这里你可以找到你所想的。
本站文章与我的 Github 中 hexo 仓库的内容完全同步;本站某个文章的评论区与 hexo 库中的同名 issues 内容完全同步。
由于本站的评论功能依赖于 GitHub issues,所以你需要确保你的网络可以正常访问 GitHub issues,才可使用本站的评论功能。其他部分不影响。
本站文章的发布与更新流程是,我在本地编辑 markdown,然后 push 到我的 hexo 仓库,触发 GitHub Webhook,随即博客站服务器拉取 hexo 仓库中的最新内容,同步更新。
依据此原理,如果你发现了某篇文章中的错误,你可以在我的 hexo 仓库中发起一个 pull request,当你的 pull request 被合并进 main 分支时,博客站 gukaifeng.cn 的内容随即会自动更新。
目前,hexo 仓库中的 markdown 文件中,保留了 hexo 博客系统用来解析的头部信息。
格式与下面类似(源码 非预览)
123456---title: date: categories: tags: -- ...
Rust Series
Rust 毕竟还是一门年轻的语言,优秀的学习资料并不是很好找,遇到问题也不那么容易解决。所以我记录下了我学习 Rust 的过程,希望其不仅是我复习查阅的笔记,也可是大家学习 Rust 的参考。
因为 Rust 语言相对较难,不太建议计算机小白直接学这个。这个系列博客的所有文章,均默认读者有一定的 C/C++ 和 Linux 基础。
下面这篇文章可以让你对 Rust 有一个初步的了解,希望能提起你的兴趣。
快速配置 Rust 开发环境并编写一个小应用
从下面的目录开始,才是从 0 开始学习 Rust 的旅程起点~~
如果你是一个和我一样的 Rust 纯纯纯新手,那么你也可以按着下面的目录顺序递进地学习 Rust。
本博客整个 Rust 系列的文章都是基于 CentOS 的,如果你使用的是非类 Unix 系统,可能不适用哦!
目录
1. 安装 Rust 然后输出 “Hello, world!” 2. Cargo - Rust 的构建系统和包管理器
RocksDB -- 高级架构
前文说过,RocksDB 是一个有 kv 接口的存储引擎库,并且 kv 是任意大小的字节流。
我们看看 RocksDB 的官方架构图:
上面的图中涉及到了几个 RocksDB 特有的东西,例如 MemTable,SST file,WAL(Write Ahead Log) 和 MANIFEST,其中 MemTable,SST file 和 WAL 是 RocksDB 中最基础的三个结构。
-
这里简单说下上面提到的几个概念:
memtable 是一个内存中的数据结构,RocksDB 先将数据库写操作写入 memtable,然后再 flush memtable 中的内容到 SST 文件中。
SST 文件是 RocksDB 存储数据的最终文件,即存在磁盘上的数据文件,默认的 SST 文件格式是 Block-based Table。
WAL(Write Ahead Log) 顾名思义,是一个写前日志。写操作除了会写入 memtable,还会写入 WAL。WAL 用于在数据库故障时恢复 memtable 中的数据。
MANIFEST 是 RocksDB 存储其状态改变的事务日志文件中,Roc ...
RocksDB -- 下载 & 编译 & 第一个 RocksDB 程序
1. 下载RocksDB 可以在 GitHub 上直接 clone 到本地,也可以在 GitHub 中的 Release 页面下载 tar.gz 文件。
GitHub 页面:https://github.com/facebook/rocksdb 。Release 页面:https://github.com/facebook/rocksdb/releases 。
此博客下载的 RocksDB 版本是 v6.25.3
2. 编译* 请不要用 make 或 make all 来编译 RocksDB,这样编译出的是 debug 版本,性能会远低于 release 版本。* RocksDB 编译不依赖任何第三方库,部分功能所依赖的第三方库是可选的。
首先,进入我们 clone 下的或解压 tar.gz 文件出的 RocksDB 目录。我这里是 ~/bubu/rocksdb-6.25.3。
下面两个编译方法二选一即可。
2.1. 方法1:编译静态库(官方推荐)输入命令 make static_lib,将开始编译静态库.
完成后,会在当前目录下创建一个 librocksdb.a 静态库文件 ...
RocksDB -- 什么是 RocksDB ?
1. 简介RocksDB 是一个有着 key/value 接口的存储引擎,由 FaceBook 公司基于 LevelDB 开发,并向后兼容 LevelDB 的 API。作为一个存储引擎,RocksDB 工作在各种各样的存储介质上,其最初的目标是快速存储 (尤其是 Flash 存储)。 RocksDB 是一个存储 key/value 的 C++ 库,kv 是任意长度的字节流。支持点查找、范围扫描,并且提供了不同类型的 ACID 保证策略。
RocksDB 平衡了可自定义性与自适应性。RocksDB 支持高度灵活的配置设置,以保证其可以再各种生产环境下运行,包括 SSD、硬盘、ramfs 以及远程存储。RocksDB 支持多种压缩算法,支持一些在产品支持与调试上的优秀工具。另一方面,RocksDB 努力限制旋钮的数量,以提供足够好的开箱即用性能,并在适用的情况下使用一些自适应算法。
2. 特性1) 专为希望在本地或远程存储系统上存储数 TB 的数据的应用服务器而设计;2) 针对在快速存储设备 (flash 设备或内存) 中存储小到中等大小的 kv 优化;3) RocksDB 可以在多核 ...
RocksDB -- 术语
本篇博客解释了 RocksDB 的相关术语。同时,考虑到术语的特殊性,部分名词仅做解释,不做翻译。
1. 2PC (Two-phase commit)表示分为两个阶段提交。悲观事务可以在两个阶段提交:首先是准备,然后是实际的提交。 See https://github.com/facebook/rocksdb/wiki/Two-Phase-Commit-Implementation
2. Backup备份。RocksDB 有一个备份工具,可以帮助用户将数据库状态备份到不同的位置,比如 HDFS。 See https://github.com/facebook/rocksdb/wiki/How-to-backup-RocksDB
3. Block cache缓存来自 SST 文件的热数据块的内存数据结构。 See https://github.com/facebook/rocksdb/wiki/Block-Cache
4. BlockSST文件的数据块。在 block-based table 的 SST 文件中,一个 block 总是被校验和检查,并且通常会被压缩存储。
5. Bloc ...
RocksDB -- 特性
1. Column FamiliesRocksDB 支持把一个数据库实例划分成多个 column families。当创建一个数据库时,如果没有指定使用那个 column family,RocksDB 就会用一个名为 “default” 的默认 column family 创建此数据库。需要注意的是,RocksDB 中的 column family 与其他地方的此概念不同,这里指的是一个独立的键空间,这很有误导性,这名字用的就很迷。
RocksDB 为用户在跨 column families 中保证了一致的视图,在启用 WAL 或者启用原子 flush 前提下的崩溃恢复以后也可以。RocksDB 还支持通过 WriteBatch API 实现跨 column families 的原子级操作。
2. UpdatesPut API 往数据库中插入单个 kv 对,如果在数据库中已经存在了 key,那之前的 value 就会被覆盖掉。Write API 可以自动地插入、更新或删除多个 kv 对。RocksDB 会保证一个Wirte,要么完成全部的操作,要么什么都不做。如果Wirte 执行插入操 ...
RocksDB Series
曾经我想过,我以后,也许会做前端、也许会做服务器、也许会去做游戏,但从没想过自己有一天会踏入数据库领域,可能是冥冥天意吧。现在,我接触到了数据库领域,摆在我面前的第一个坎,便是这业内使用极为广泛的 RocksDB kv 存储引擎。寻觅很久,但 RocksDB 的相关学习资料甚少。于是便有了此系列博客,我将在学习 RocksDB 数据库的同时在此系列博客中记录其过程,希望可以帮到后来人。
此系列博客的所有文章,均基于 RocksDB v6.25.3 撰写。使用版本 v6.25.3 是因为,本弱鸡开始学习 RocksDB 并且撰写此博客时,这是 RocksDB 的最新版本。固定版本仅仅是为了便于学习,同时将忽略此版本以前的 bug,专注于 RocksDB 在此版本中已经提供的内容。固定版本并不代表不再关注 RocksDB 新版本中的的新特性,以及后续新版本中对 v6.25.3 版本中现存 bug 的修复,这些内容将在学习完 v6.25.3 后继续探索。
此笔记分为概念篇、使用篇与源码篇:概念篇讲述了 RocksDB 的一些概念、术语、结构等内容;使用篇帮助大家来使用原生 RocksD ...