RocksDB -- 迭代器 Iterator 类
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
Rust -- 错误处理
程序中的错误是不可避免的。
大多编程语言都有异常这个概念,并通过异常机制来应对错误。
Rust 中要求你承认出错的可能性,并在编译代码之前就采取行动。
Rust 中没有异常概念,而是将错误分成了两个主要类别:
可恢复错误 Result<T, E>:通常代表向用户报告错误和重试操作是合理的情况,比如未找到文件。
不可恢复错误 panic!:通常是 bug 的同义词,比如尝试访问超过数组结尾的位置。
下面先介绍不可恢复错误 panic!,然后再说如何返回 Result<T, E>。然后还会探讨尝试从错误中恢复还是停止执行时的注意事项。
1. panic! 宏与不可恢复的错误下面的内容要求你了解调用栈,如果你不知道什么是调用栈,可能需要先补一下。
Rust 中有一个宏 panic!,当这个宏被执行时,程序会打印出一条错误信息,展开、清理栈数据,然后退出。panic! 宏被执行的场景通常是程序检测到某些 bug,而且程序员不清楚如何处理(因为这个宏是程序员手动触发执行的)。
当程序出现 panic 时,程序有两种选择,一种是展开,另一种是终止。
展开是程序默认的选 ...
RocksDB -- DB 类
DB 类中提供的方法较多,牵扯到的旁支内容也多,所以这篇文章需要一定时间才能完成。
目前是未完成的状态,随时更新,完成以后这段文字就会删除。
1. 什么是 DB 类DB 类是 RocksDB 中一个非常基础且常用的类,我们对 RocksDB 数据库的大部分操作,都是通过 DB 对象来执行的。
DB 是一个持久的、版本化的、从键到值的有序映射。
DB 对于多个线程的并发访问是安全的,而不需要任何外部同步。
DB 是一个抽象基类,它有一个主实现(DBImpl)和许多包装器实现。
在 DB 类的定义中,有一部分方法是 static 的,其余都是 virtual 的,virtual 的方法有一些在 DB 类中有实现,有一些只有声明,需要派生类去实现。DB 类的定义中,还有一些常量定义,常量定义都是 static 的。
DB 类的定义中,所有的内容,都是 public 的。
DB 类定义在头文件 db.h 中,点此查看。
我们先在此文章中介绍 DB 抽象类的相关内容,了解完 DB 类,我们就对 RocksDB 的基本操作有一定了解了。
这篇文章不会讲大部分方法的具体实现,少部分比较简单的会 ...
RocksDB -- Status 类
1. 什么是 Status 类Status 是 RocksDB 中大部分操作函数的返回值类型。
Status 类封装了 RocksDB 操作的结果。它可以指示成功,也可以指示带有相关错误信息的错误。
多个线程可以在没有外部同步的情况下调用 Status 类中的 const 方法,但是如果任何一个线程可以调用非 const 方法,那么访问相同 Status 的所有线程都必须使用外部同步。
Status 类定义在头文件 status.h 中,点此查看。
2. Status 类内成员Status 类内成员定义的部分代码如下:
1234567891011 protected: // A nullptr state_ (which is always the case for OK) means the message // is empty, else state_ points to message. Code code_; SubCode subcode_; Severity sev_; const char* state_;#ifdef ROCKSDB_ASSERT_S ...
RocksDB -- Slice 类
RocksDB Slice 类定义在 slice.h 头文件中。点此查看 slice.h。
1. Slice 类的成员Slice 是 RocksDB 中一个非常简单又很常用的类,其中只有两个成员:
123// private: make these public for rocksdbjni accessconst char* data_;size_t size_;
data_: 这是一个指向外部存储的指针;
size_: 记录 data_ 指向的存储空间大小。
在目前 RocksDB 的版本中,这两个成员默认都是 public 的,可以注意到,源码中的 private 被注释掉了,原因也一并写在了注释中,当然我们暂且不关注这个。
2. Slice 类的方法Slice 类中的大多方法都直接实现在 slice.h 头文件中,部分实现在 slice.cc源文件中。点此查看 slice.cc。
下面按照 slice.h 中的顺序,依次介绍其中方法。
2.1. 构造函数构造函数有 6 个重载,下面按代码中的顺序依次说。
1. 创建一个空的 Slice
1Slice() : data_(& ...
Rust -- 使用 Packages, Crates 和 Modules 管理越来越复杂的项目
Rust 具有许多特性,这些特性允许你管理代码的组织,包括哪些细节是公开的,哪些细节是私有的,以及程序中每个作用域中的名称。这些特性,有时统称为模块系统,包括:
Rust 中的一些特性可以使得你更好的管理、组织代码,比如哪些部分是公开的,哪些细节是私有的,再比如程序中每个作用域的名字。
这些特性,在 Rust 中一般统称为模块系统(module system)。
模块系统包含以下几个部分:
Packages(包): 一个可以让你构建、测试和分享 crates 的 Cargo 特性;
Crates: 一个可以生成库或可执行文件的模块树;
Modules(模块) 和 use: 允许你控制路径的组织、作用域和私有性;
Paths(路径) : 一种命名项目的方法。例如结构体,函数或模块。
这里这个 Paths(路径) 我觉得有必要解释一下。Rust 中的路径指的不是文件系统的路径,但与之类似,指的是一些项的路径(比如函数、模块、常量等等)。例如 mod1::mod2::func() 就是函数 func() 的路径,Rust 会按照 mod1 -> mod2 -> func() ...
在自己的服务器上搭建 Hexo 博客
以前用 Hexo 是搭载 GitHub Page 上的,但是确实稳定性很迷。于是尝试在自己的服务器上搭建 Hexo 博客。
在自己的服务器上搭建 Hexo 博客流程,主要分为两部分,服务器配置和本地 Hexo 配置。
下面开始!
1. 服务器配置本文的服务器系统环境为 CentOS 8.2。你的服务器需要已经安装好 Nginx 与 Git,这个过程不是本文重点,就不说了。
服务器配置主要要做下面几件事:
新建一个 Linux 用户,并赋予 root 权限;
创建一个 Hexo 的 Git 仓库目录;
创建一个 Hexo 的工作目录,也是 Nginx 提供 Web 服务的根目录;
配置 Git Hook(这个在 3.3 节说);
配置并启动 Nginx。
这里再简单解释下,第 1 条中 Hexo 的 Git 仓库,存储的是 Git 仓库信息,不是最终的仓库。第 2 条中的工作目录,就是真正显示在网页中的根目录,即有 index.html 的那个目录,在 Github Page 上搭建 Hexo 博客时,你的库目录与这个等价。
下面开始一个个步骤说。
1.1. 新建一个 Linux ...
Rust -- 动态链表 LinkedList
LinkedList 是 Rust 标准库中提供的双链表。
1pub struct LinkedList<T> { /* fields omitted */ }
这里只介绍几个常用操作,更多内容请看文档 LinkedList in std::collections - Rust。
使用 LinkedList 需要先 use std::collections::LinkedList;。
1. 新建 LinkedListLinkedList 可以使用 LinkedList::new() 函数创建一个空的,也可以从现有的数组创建。
1pub const fn new() -> LinkedList<T>
下面通过示例代码了解如何新建一个 LinkedList。
123456789101112131415#![allow(unused)]use std::collections::LinkedList;fn main() { let mut list0 = LinkedList::from([1, 2, 3]); // 元素 ...
Rust -- 集合 HashSet
和大多编程语言一样,Rust 中的集合也是存 key 的,key 不可重复。
Rust 中 HashSet 的声明如下:
12pub struct HashSet<T, S = RandomState> { /* fields omitted */ }
使用集合 HashSet 需要先 use std::collections::HashSet;。
这篇文章只会介绍几个基础用法,用以入门,详细内容请看官方文档 HashSet in std::collections - Rust。
另外要注意,Rust 中 HashSet 的实现,其实是把 HashMap 的键保留,值设成 () (但是在概念上,HashSet 把 HashMap 里的键称作值,HashMap 的值就相当于没有了)。建议先学习 HashMap。
1. 新建一个 HashSet新建 HashSet 要使用 HashSet::new() 函数。
12345678910#![allow(unused)]use std::collections::HashSet;fn main() { ...
Rust -- 哈希表 HashMap
哈希表非常常用,这篇文章不介绍什么是哈希表,只说下 Rust 标准库中提供的哈希表 HashMap。
Rust 中 HashMap 的声明如下:
12pub struct HashMap<K, V, S = RandomState> { /* fields omitted */ }
使用哈希表 HashMap 需要先 use std::collections::HashMap;。
这篇文章只会介绍几个基础用法,用以入门,详细内容请看官方文档 HashMap in std::collections::hash_map - Rust。
1. 新建一个 HashMap新建 HashMap 要使用 HashMap::new() 函数。
下面看代码:
12345678910111213#![allow(unused)]use std::collections::HashMap;fn main() { let mut scores0 = HashMap::new(); // 新建一个空的 HashMap,类型由 Rust 根据下面的插入操作推断, ...