共识算法-LevelDB

 LevleDB 是什么 

  • leveldb 是 google 两位工程师使用 C++实现的单机版 k-v 存储系统
  • key 和 value 都是任意的字节数组,支持内存和持久化存储 
  • 数据都是按照 key 排序,用户可以重写排序函数
  • 包含基本的数据操作接口,Put(key,value),Get(key),Delete(key)
  • 多操作可以当成一次原子操作 

LevleDB 的局限性 

  • leveldb 是非关系型数据库,不支持 SQL 查询也不支持索引
  • 同一时间只支持单进程(支持多线程)访问 db
  • 不支持客户端-服务器模型,用户需要自己封装 

LevelDB工作流程

LevelDB存储介质分为内存和硬盘两种

(一)内存:内存中有memtable 和immutable memtable

(二)硬盘:硬盘中有log文件,manifest文件,current文件和sstable文件


//DB的结构体
type DB struct {
	path string
	data map[string][]byte
}

//模拟开启
func New(path string) (*DB, error) {
	self := DB{
		path: path,
		data: make(map[string][]byte),
	}
	return &self, nil
}

//模拟关闭
func (self *DB) Close() error {
	return nil
}

Put

//Put
func (self *DB) Put(key []byte, value []byte) error {
	self.data[string(key)] = value
	return nil
}

Get

//Get
func (self *DB) Get(key []byte) ([]byte, error) {
	if v, ok := self.data[string(key)]; ok {
		return v, nil
	} else {
		//取不到
		return nil, fmt.Errorf("NotFound")
	}
}

Delete

//Delete
func (self *DB) Del(key []byte) (error) {
	if _, ok := self.data[string(key)]; ok {
		delete(self.data, string(key))
		return nil
	} else {
		return fmt.Errorf("NotFound")
	}
}

模拟遍历:

//定义
type Iterator interface {
	Next() bool
	Key() []byte
	Value() []byte
	Close() error
}

//定义一个键值对结构体
type Pair struct {
	Key   []byte
	Value []byte
}

//定义迭代器
type DefaultIterator struct {
	data   []Pair
	index  int
	length int
}

func NewDefaultIterator(data map[string][]byte) *DefaultIterator {
	//创建默认迭代器
	self := new(DefaultIterator)
	self.index = -1
	self.length = len(data)
	for k, v := range data {
		p := Pair{
			Key:   []byte(k),
			Value: v,
		}
		//遍历出的数据添加到data
		self.data = append(self.data, p)
	}
	return self
}

//是否存在下一个值
func (self *DefaultIterator) Next() bool {
	//若还有值,index加1
	if self.index < self.length-1 {
		self.index++
		return true
	}
	return false
}

func (self *DefaultIterator) Key() []byte {
	//判断是否越界
	if self.index == -1 || self.index >= self.length {
		panic(fmt.Errorf("越界"))
	}
	return self.data[self.index].Key
}

func (self *DefaultIterator) Value() []byte {
	//判断是否越界
	if self.index >= self.length {
		panic(fmt.Errorf("越界"))
	}
	return self.data[self.index].Value
}

func (self *DefaultIterator) Close() error {
	return nil
}

猜你喜欢

转载自blog.csdn.net/super_lixiang/article/details/82747629