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章起只有简单的指引,适合爱好挑战和自学的读者。
可以购买有详细指导+背景知识的完整版。