共識演算法-LevelDB

super_lixiang發表於2018-09-18

 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
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章