版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/simonyucsdy/article/details/81638160
首先时leveldb的外部接口
Code:include/leveldb/db.h
class DB {
public:
static Status Open(const Options& options, const std::string& name, DB** dbptr);
virtual Status Put(const WriteOptions& options,
const Slice& key,
const Slice& value) = 0;
virtual Status Delete(const WriteOptions& options, const Slice& key) = 0;
virtual Status Write(const WriteOptions& options, WriteBatch* updates) = 0;
virtual Status Get(const ReadOptions& options,
const Slice& key, std::string* value) = 0;
//
主要的五个外部接口
- Open
- Put
- Delete
- Write
- Get
Write与Put的区别在于,Write是批处理写。比如有两个{key1: val1, key2: val2}一定要同时写入,要么同时写成功,要么同时写失败。而Put只是支持单项的写入。(从底层实现上来说,最后都是调用Write接口。因为写单项的时候,只是相当于批处理里面只有一个Job,从而实现了统一)。
如果只是从简单的代码的角度上来讲。实现这四个接口的代码并不难。那么为什么LevelDB面临的问题又是什么?要解决的问题又是什么?
假设想完成一个单机版的KV存储系统。
- 不能只用内存,内存资源宝贵而且要防止用户数据掉电丢失。
- 外部存储空间很大,但是存取速度很慢。
- 外部磁盘的特点:顺序写与顺序读速度比较快,随机写与随机读则需要磁盘寻道速度很慢。
这个时候就清楚LevelDB需要解决的问题是什么样的了。
- 在以上条件的制约下,如何设计一个可靠的高性能的KV存储系统。
极度情况下,追求写速度的做法是