|
|
@ -8,7 +8,19 @@ leveldb中的存储原本只支持简单的字节序列,在这个项目中我 |
|
|
|
设计目标:对value存储读取时进行序列化编码,使其支持字段。 |
|
|
|
|
|
|
|
实现思路:设计之初有考虑增加一些元数据(例如过滤器、字段偏移支持二分)来加速查询。但考虑到在数据库中kv的数量是十分庞大的,新加数据结构会带来巨大的空间开销。因此我们决定在这里牺牲时间换取空间,而将时间的加速放在索引中。 |
|
|
|
在这一基础上,我们对序列化进行了简单的优化:将字段名排序后,一一调用leveldb中原本的编码方法`PutLengthPrefixedSlice`存入value。这样不会有额外的空间开销,而好处在于遍历一个value的字段时,如果得到的字段名比目标大,就可以提前结束遍历。 |
|
|
|
在这一基础上,我们对序列化进行了简单的优化:将字段名排序后,一一调用leveldb中原本的编码方法`PutLengthPrefixedSlice`存入value。这样不会有额外的空间开销,而好处在于遍历一个value的字段时,如果得到的字段名比目标大,就可以提前结束遍历。 |
|
|
|
``` |
|
|
|
std::string SerializeValue(const FieldArray& fields){ |
|
|
|
FieldArray sortFields = fields; |
|
|
|
std::sort(sortFields.begin(), sortFields.end(), compareByFirst); |
|
|
|
std::string result; |
|
|
|
for (const Field& pairs : sortFields) { |
|
|
|
PutLengthPrefixedSlice(&result, pairs.first); |
|
|
|
PutLengthPrefixedSlice(&result, pairs.second); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
``` |
|
|
|
最终db类提供了新接口`putFields`, `getFields`,分别对传入的字段序列化后调用原来的`put`, `get`接口。 |
|
|
|
`FindKeysByField`调用`NewIterator`遍历所有数据,field名和值符合则加入返回的key中。 |
|
|
|
|
|
|
@ -49,14 +61,14 @@ class FieldDb { |
|
|
|
5. fieldDb也提供了`put`, `get`,`getFields`, `putFields`,`delete`接口。对前三者,简单调用`kvDb`中的对应接口(不涉及索引)。 |
|
|
|
对`putFields`,先判断是否有`fieldWithIndex`中有的字段,如果有,并对`kvDb`调用一个(多个)`put`,**但在写日志时一并加上索引日志写入**。 |
|
|
|
`delete`逻辑一致。 |
|
|
|
6. 针对索引的日志:为了保证两个数据库间的一致性,由`kvDb`的日志模块统一管理。这其中包含了两种chunk(kv写入和索引写入),在恢复时需要分别解析,决定往哪一个数据库中写入。索引写入的时机在4、5中的**加粗**部分,如何编码还有待设计。也就是说,`indexDb`本身的索引模块不再起到作用,项目后期可以修改关闭这一部分。 |
|
|
|
6. 针对索引的日志:为了保证两个数据库间的一致性,由`kvDb`的日志模块统一管理。这其中包含了两种chunk(kv写入和索引写入),在恢复时需要分别解析,决定往哪一个数据库中写入。索引写入的时机在4、5中的**加粗**部分,如何编码还有待设计。也就是说,`indexDb`本身的日志模块不再起到作用,项目后期可以修改关闭这一部分。 |
|
|
|
7. 对两个数据库的其他部分,理论上每个数据库内部的其他模块不会互相影响。 |
|
|
|
|
|
|
|
|
|
|
|
# 3. 数据结构设计 |
|
|
|
具体设计模块化,实现时再具体考虑。 |
|
|
|
`indexDb`的kv编码:**暂时考虑助教文档那种** |
|
|
|
区分日志中kv部分和index部分:**有待完成** |
|
|
|
区分日志中kv部分和index部分:思路是在writebatch中某个地方加个标识区分,每一类的编码与各自的key编码类似**细节有待完成** |
|
|
|
|
|
|
|
# 4. 接口/函数设计 |
|
|
|
`FieldDb`的对外接口函数之前已展示,这里补充一些子数据库需提供给`FieldDb`的抽象功能(暂时想到的): |
|
|
@ -84,3 +96,9 @@ mark一些原代码(db中)的修改点:recover时日志解析修改,write时 |
|
|
|
功能 | 完成日期 | 分工 |
|
|
|
:------|:---------|:------ |
|
|
|
value序列化|11.19 | 李度 |
|
|
|
fieldDb接口|11.25|陈胤遒 |
|
|
|
lab1整体+测试|11.30|高宇菲 |
|
|
|
fieldDb功能实现|12.10|李度 |
|
|
|
kvdb功能实现与原代码修改|12.10|陈胤遒 |
|
|
|
整体系统整合+测试|12.20|李度、陈胤遒、高宇菲 |
|
|
|
性能测试|12.30|高宇菲 |