0602: 查询 SSTable

读取 SSTable

上一步其实是将 []struct{ key []byte; val []byte } 序列化到硬盘上。这个格式不用经过反序列化就能直接使用,不用全部加载到内存里。现在实现读取数组里第n对KV:

type SortedFile struct {
    FileName string
    fp       *os.File
    nkeys    int    // 增加
}

func (file *SortedFile) index(pos int) (key []byte, val []byte, err error)

Seek & iterate

然后通过 index() 实现实现二分查找和迭代器。

func (file *SortedFile) Seek(key []byte) (SortedKVIter, error) {
    // ...
    iter := &SortedFileIter{file: file, pos: pos}
    // ...
    return iter, nil
}

从现在起,尽量返回 interface 而不是具体的实现,以后模块间交互要用到。 Iterator 实现跟已有的 KVIterator 差不多:

type SortedFileIter struct {
    file *SortedFile
    pos  int
    key  []byte
    val  []byte
}

func (iter *SortedFileIter) Valid() bool {
    return 0 <= iter.pos && iter.pos < iter.file.nkeys
}
func (iter *SortedFileIter) Key() []byte { return iter.key }
func (iter *SortedFileIter) Val() []byte { return iter.val }
func (iter *SortedFileIter) Next() error
func (iter *SortedFileIter) Prev() error

您正在阅读免费版教程,从第4章起只有简单的指引,适合爱好挑战和自学的读者。
可以购买有详细指导+背景知识的完整版