目录

从世界的中心到宇宙的中心 Weekly 2022 09 12


首先恭祝关注本博的各位中秋快乐!花好月盈,团团圆圆!

技术

Redis 与结构化数据存储

本周的主要工作仍然是在 OpenDAL 上。经过了和 @xuanwo 的反复研究讨论,OpenDAL RFC0623 总算是被 merge 了。

RFC0623 主要研究了如何在 OpenDAL 中提供基于 Redis 的存储支持。在这段时间内,设计也反反复复发生变化。

读者都知道,一个文件系统要存储一个文件,除了它本身的内容以外,还需要存储它的各类属性如创建时间、修改时间、所有者等【元数据】。为了在 Redis 中提供一个类似文件系统的视图,除去数据块的本身内容外,还需要亲自去维护数据块的元数据——这在常用的对象存储中可不需要亲力亲为。毫无疑义地,数据块和它的对应元数据被分成了两个独立的键值对进行存储。

在元数据存储上,问题就变得有意思了起来。Redis 提供了一个半结构化的数据结构——HASHHASH 本质上是一个哈希表,通过用户提供的键可以查询到其对应的具体值。类似如下:

1
2
3
4
5
6
7
key: "brown tea"
value:
  - key: "created"
    value: "1919-08-10T11:45:14+09:00"
  - key: "owner"
    value: "Yaju Senpai"
  # other key-value pairs...

于是尽可以通过元数据对应的 Key 以及各个需要的域,查询到具体的值。Redis 为此还提供了 HMGET 命令方便用户一次性查询多个域的内容。优点是直接使用了 Redis 的原生数据结构,速度较快且直观;缺点是这些返回的值基本上都是字符串类型,需要手动进行类型转换。

除了使用 HASH 外,@xuanwo 提到可以存储用 bincode 序列化的内容。只需要让表示元数据的结构体支持序列化和反序列化,通过 serdebincode,即可实现更方便的从原始 rust 结构体与外部数据间的编解码。届时先编码然后存储为 Redis 的字符串类型即可。类似于:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#[derive(Serialize, Deserialize)]
struct Poem {
    p1: String,
    p2: String,
}

let poem = Poem {
    p1: "just".to_string(),
    p2: "monika".to_string(),
}
1
2
key: "poem"
value: "just\0monika\0"

最后经过测试,发现两者的具体速度其实相差非常小。但是由于直接使用编解码的方案可以直接依靠 serde 进行序列化和反序列化工作而不用自己搞错误处理,非常地舒适,于是决定采用后者。

除此之外,初步进行了一些实现上的工作。

生活

返校报到

收拾一天行李,然后返校在学校里面折腾到晚上8点收拾完自己的东西。到了快9点帮同学搬了8大件的行李——为啥女生的行李可以这么多啊!💢

在返校后的几天跟学长去见了导师。导师神采奕奕,嗓音圆润厚重地跟我们一行人尬聊了45秒。我导嘿嘿一笑,指定了同届的另一个同学做助教,还是没给我们指派具体科研任务,可以继续专心实习。

与 Rinchannowww 胜利会师,交流了一些关于 rw labs、databend 的一些坑、未来去处和家里拥有63套房子的烦恼方面的事情。

在图书馆借来了《MariaDB 原理与实现》、《共同的底线》,打算这个月看看。

防疫

形式主义,满满当当。可以感受到学生和学校之间的紧张气氛。

游戏

Apex 上白银 II 了,我的准度每天都在进步!周末的晚上有时间就试试练习滚轮跳吧。

俄乌局势

乌克兰方面获得了从未料想到的大捷。这场战役是要载入史册的。

攻守之势易也。